画像を再描画

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
daj

画像を再描画

#1

投稿記事 by daj » 13年前

javaです。
以下の、ウィンドウ中に画像を表示するプログラムをeclipseで実行、
出力されたウィンドウを別のウィンドウで上にかぶせて、出力された方のウィンドウを見たら、
出力されたウィンドウ中の画像が消えてしまうことが分かりました。
最小化、再実行すると直りますが、このままでは好ましくないです。何か良い改善方法は無いでしょうか?
素人意見としては、アクティブになったら再描画する、かぶせられても画像が消えないようになる等が方法になるのかと考えているのですが、どうプログラミングすればいいかまではわかってないです。

コード:

import java.awt.Graphics;
import java.awt.Image;
import javax.swing.JFrame;
public class Jpeg extends JFrame
{
    Image[] img = new Image[10];
    public Jpeg()
    {
        super("Win JPEG");
        img[0] = getToolkit().getImage("0.gif");
        img[1] = getToolkit().getImage("1.gif");
        img[2] = getToolkit().getImage("2.gif");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(320, 230);
        setVisible(true);
    }
    public static void main(String[] args)
    {
        new Jpeg();
    }
    public void paint(Graphics g)
    {
        super.paint(g);
        int ofs = 0;
        for (Image img : this.img) {
            if (img!=null) {
                g.drawImage(img,16+ofs,40+ofs,this);
                ofs += 10;
            }
        }
    }
}

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: 画像を再描画

#2

投稿記事 by ISLe » 13年前

こちらでは現象を確認できなかったのですが、JFrameのpaintメソッドをオーバーライドしているのが問題なのだと思います。

Swingではpaintメソッドをオーバーライドしないのがお約束です。
JComponentを継承したコンポーネントを使い、paintComponentをオーバーライドして描画を行います。

以下のコードではいかがでしょう。

コード:

import java.awt.Graphics;
import java.awt.Image;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Jpeg extends JPanel
{
	Image[] img = new Image[10];
	public Jpeg()
	{
		img[0] = getToolkit().getImage("0.gif");
		img[1] = getToolkit().getImage("1.gif");
		img[2] = getToolkit().getImage("2.gif");
	}
	public static void main(String[] args)
	{
		JFrame frame = new JFrame("Win JPEG");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(new Jpeg());
		frame.setSize(320, 230);
		frame.setVisible(true);
	}
	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		int ofs = 0;
		for (Image img : this.img) {
			if (img!=null) {
				g.drawImage(img,16+ofs,40+ofs,this);
				ofs += 10;
			}
		}
	}
}
#もはや内容とクラス名(ウィンドウタイトルも)が一致してない。

daj

Re: 画像を再描画

#3

投稿記事 by daj » 13年前

返信ありがとうございます。
確かに直りました!
これを参考に頑張ります。

閉鎖

“C言語何でも質問掲示板” へ戻る