ページ 11

画像を再描画

Posted: 2013年1月29日(火) 21:18
by daj
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;
            }
        }
    }
}

Re: 画像を再描画

Posted: 2013年1月29日(火) 23:20
by ISLe
こちらでは現象を確認できなかったのですが、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;
			}
		}
	}
}
#もはや内容とクラス名(ウィンドウタイトルも)が一致してない。

Re: 画像を再描画

Posted: 2013年1月29日(火) 23:39
by daj
返信ありがとうございます。
確かに直りました!
これを参考に頑張ります。