- PR -

再描画時に自動的に画像を復帰させる方法

1
投稿者投稿内容
fuzuki
常連さん
会議室デビュー日: 2003/08/23
投稿数: 48
投稿日時: 2003-08-26 01:19
こんにちは。

paintメソッドを使っていない場合、一度描いた画像はウィンドウをリサイズしたりした際にupdateメソッドが自動的に呼ばれて画面がまっさらの状態になってしまいますが、これを防ぐ方法はありますか?

例えば、描いた画像の情報を変数などに保存しておいて、画面がリフレッシュされた後に自動的にそれを呼び出して再描画するということができそうな感じがするのですが、どうもやり方が見つかりません。

簡単な例としては、以下のようなものです。ここでは一度ボタンを押すと円が描かれるようになっていますが、このウィンドウをリサイズすると円が消えてしまいます。この円を自動的に復帰させるようなことはできますでしょうか?

------------------------------------------------------
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

/* <APPLET CODE="Test.class" height=350 width=200></APPLET> */
public class Test extends JApplet implements ActionListener
{
private JButton button = new JButton ("Draw!");
private Graphics g = null;

public void init()
{
Container c = getContentPane();
button.addActionListener(this);
g = getGraphics();

c.setLayout (new FlowLayout());
c.add(button);
}
public void actionPerformed (ActionEvent e)
{
g.fillOval(50, 50, 100, 100);
}
}
------------------------------------------------------
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2003-08-26 17:57
素直にpaint()メソッドをオーバーライドしてやりましょう。
その方が楽です。

コード:
public class Test extends JApplet implements ActionListener {
	private JButton button = new JButton ("Draw!");

	public void init() {
		Container c = getContentPane();
		button.addActionListener(this);

		c.setLayout (new FlowLayout());
		c.add(button);
	}
	
	public void paint(Graphics g) {
		g.fillOval(50, 50, 100, 100);
	}
	
	public void actionPerformed (ActionEvent e) {
		repaint();
	}
}



確認していないので、動くかどうか分かりません。
fuzuki
常連さん
会議室デビュー日: 2003/08/23
投稿数: 48
投稿日時: 2003-08-26 21:16
ご返事ありがとうございました。

paintをオーバーライドするやり方だと、ボタンを押す押さないにかかわらず最初から円が描かれてしまいます。これを避けるために、getGraphics()を使っているのですが、やはり、リフレッシュされた時に自動で画像を復帰させるとすると、paintを使うしかないのでしょうか。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2003-08-27 00:57
引用:

paintをオーバーライドするやり方だと、ボタンを押す押さないにかかわらず最初から円が描かれてしまいます。これを避けるために、getGraphics()を使っているのですが、やはり、リフレッシュされた時に自動で画像を復帰させるとすると、paintを使うしかないのでしょうか。



リフレッシュされると、なんやかんやといろんなメソッドを介してupdate()メソッドが呼ばれ、そのあとまたいろいろあって、最後にpant()メソッドが呼ばれます。

したがって、どのみちpaint()はオーバーライドしなければなりません。

ちにみに
引用:

素直にpaint()メソッドをオーバーライドしてやりましょう。
その方が楽です。



と書きましたが、swingの場合、paintComponent()をオーバーライドを方法が普通です。
java.applet.Appletの場合と勘違いしていました。

で、ボタンが押されたらイメージを表示したければ、フラグを用意して場合分けするという方法はいかが?
fuzuki
常連さん
会議室デビュー日: 2003/08/23
投稿数: 48
投稿日時: 2003-08-27 16:22
paintComponent()とフラグを使って試したところ、希望通りの動作ができました。

paintだけで一生懸命やろうとしていたのですが、フラグを使うというのはなぜか全く思いつきませんでした。

どうもありがとうございました。
1

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