- PR -

Swingのペイント

投稿者投稿内容
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2005-07-31 01:33
KDSさん、こんにちは。

引用:
Editはなぜ出来ないかわかりません。


どのようにして「できない」と判断されたのですか?
どうなって欲しいのが、どうなってしまったのでしょうか?
KDS
常連さん
会議室デビュー日: 2005/07/15
投稿数: 38
投稿日時: 2005-08-01 13:59
出来ないと判断したのは、
メニューのEditのClearを選択しても、
画面に描かれたフリーラインが消えないからです。

それは画像を表示する前もした後も消えませんでした。
他のメニュー(Open、Save、Exit)は形は出来るのですが。。。
(Saveは前の投稿のままです。。。)
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2005-08-02 00:49
KDSさん、

フリーラインが消えないのは、消してないからではないでしょうか?

BufferedImageにフリーラインを描画していますから、repaint() → paintComponent( )しても、フリーラインの書かれた状態のイメージで再描画しているからだと思うのですが、如何でしょう?

Clearするときに、BufferedImageも再初期化するのが良いと思います。
実際には、Clearのアクション中で imageに nullを設定するのが簡単です。

コード:

public void actionPerformed(ActionEvent event) {
image = null; // この行を追加
panel.repaint();
}



[ メッセージ編集済み 編集者: Kissinger 編集日時 2005-08-02 00:51 ]
KDS
常連さん
会議室デビュー日: 2005/07/15
投稿数: 38
投稿日時: 2005-08-04 21:54
Kissingerさんありがとうございます
しかし、Imageをnullしたら、
Clearの際に画像が消えてしまいました。。。

あとやっぱりSaveする事ができません。。
自分なりに考えて、
目星はつけたのですが、どう変えるのか分からず。。。

描画した画像を保存する事が出来ないです。

コード:
      try
      {
         ImageOutputStream imageOut 
            = ImageIO.createImageOutputStream(f);
         writer.setOutput(imageOut);
                   
         writer.write(new IIOImage(images[0], null, null));      
         for (int i = 1; i < images.length; i++)
         {
            IIOImage iioImage 
               = new IIOImage(images[i], null, null);
            if (writer.canInsertImage(i))
               writer.writeInsert(i, iioImage, null);            
         }
      }
      catch (IOException exception)
      {
         JOptionPane.showMessageDialog(this, exception);
      }


ここのtryの中身を変化させたら出来ると思うのですが、
どのように変えたら良いか分からず。。

分かる方いらっしゃったらお願いします。
いっきゅう
大ベテラン
会議室デビュー日: 2004/04/04
投稿数: 153
お住まい・勤務地: 兵庫
投稿日時: 2005-08-05 10:44
> しかし、Imageをnullしたら、
> Clearの際に画像が消えてしまいました。。。

image作成時に元画像をもっておいてそれで再描画すればいいだけですよね?
コード:

BufferedImage subimage = null; // 元画像の変数を定義しておく

// 画像ロード時imageからコピーする
subimage = new BufferedImage(image.getWidth(),image.getHeight(),BufferedImage.TYPE_INT_RGB);
subimage.getGraphics().drawImage(image,0,0,null);

// Clear時
Graphics2D g = (Graphics2D)image.getGraphics();
g.setColor(panel.getBackground());
g.fillRect(0,0,image.getWidth(),image.getHeight());
g.dispose();
if ( subimage != null ) {
image = new BufferedImage(subimage.getWidth(),subimage.getHeight(),BufferedImage.TYPE_INT_ARGB);
image.getGraphics().drawImage(subimage,0,0,null);
}
panel.repaint();



> あとやっぱりSaveする事ができません。。
> 自分なりに考えて、
> 目星はつけたのですが、どう変えるのか分からず。。。

imagesというご自分でもわからずに書いているようですが
以下のようにシンプルに
コード:

ImageOutputStream imageOut = ImageIO.createImageOutputStream(f);
writer.setOutput(imageOut);
writer.write(image);
writer.dispose();
imageOut.close();


後、ちゃんとリソースの解放やStreamのクローズ処理は意識しましょう。

それかもっと簡単に以下でもいいと思います。
コード:

ImageIO.write(image,formatName,f);



画像がよみこまれてない場合、panelからimageを作成するよりも
画面作成時に最初に一発
コード:

image = new BufferedImage(600,500,BufferedImage.TYPE_INT_RGB);
Graphics2D g = (Graphics2D)image.getGraphics();
g.setColor(panel.getBackground());
g.fillRect(0,0,600,500);
g.dispose();


と空のイメージを作成しておいたほうがいいでしょう。

もう少しのようですのでがんばってください。


[ メッセージ編集済み 編集者: いっきゅう 編集日時 2005-08-05 10:47 ]
KDS
常連さん
会議室デビュー日: 2005/07/15
投稿数: 38
投稿日時: 2005-08-05 21:08
いっきゅうさん
レスありがとうございます。

Saveが出来るようになりました(^^)
ほんとうにありがとうございます。

あとはClearなんですが、
どこに挿入すればよいのか分からないので、
いっきゅうさんのカキコを見ながら勉強したいと思います。

ほんとうにありがとうございました。
KDS
常連さん
会議室デビュー日: 2005/07/15
投稿数: 38
投稿日時: 2006-01-20 20:05
かなり前のことなのですが、
あれから他の機能をつけることで、
手一杯になってしまい、未だこのクリアの機能を実装する事が出来ずにいました。。

1週間くらいいっきゅうさんのカキコを見ながら、
試してはいるのですが、なかなか画像の上に描画したラインを消す事が出来ずにいます。

これ以上簡単な説明の方が難しいかも知れませんが、
もうすこしヒントをもらえないでしょうか。。

スキルアップ/キャリアアップ(JOB@IT)