- PR -

表示させた画像が一瞬で消えてしまう

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

画像ファイルをFileChooserから選択して、選択された画像を表示するプログラムを作成しているのですが、drawImageの部分でほんの一瞬だけ画像が表示されてすぐに消えてしまいます。
これは再描画されているせいか思い、paintComponentを使ったりしていろいろ試しているのですがうまくいきません。なぜか、画像の表示の前にメッセージボックスを表示すると画像は消えずに表示されます。ただ、これで表示され続けたとしても他のウィンドウが前に来ると全て消えてしまいます。これは再描画されてないせいですよね?

最初から画像が決まっていてpaint(Graphics graphics)が使用できる場合はpaintを使えば自動で再描画もしてくれますが、このような場合はどのようにしたら良いのでしょうか?

具体的なコードは以下のような感じです。

すみませんが、どなたか分かる方いらっしゃいましたらよろしくお願いいたします。

コード:
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;

public class ImageTest extends JFrame implements ActionListener
{
  private Image image;
  private MediaTracker tracker;
  private Graphics g;

  private JPanel panel1; // panel1には画像を表示
  private JPanel panel2; // panel2にはfile chooserボタンを配置
  private JButton button = new JButton("Open");
  private JFileChooser chooser = new JFileChooser();

  public static void main(String[] args)
  {
    ImageTest it = new ImageTest();
  }

  public void paintComponent(Graphics g) // こんな感じでやればうまくいくかと思ったが失敗
  {
    g = panel1.getGraphics();
    g.drawImage(image, 0, 0, this);
  }

  public ImageTest() // コンストラクタ
  {
    Container c = getContentPane();
    panel1 = new JPanel();
    panel2 = new JPanel();

    panel1.setBackground(Color.white);

    panel1.setPreferredSize(new Dimension(100, 300));
    panel2.setPreferredSize(new Dimension(50, 50));

    button.addActionListener(this);

    panel2.add(button);

    c.setLayout(new BorderLayout());
    c.add(panel1, BorderLayout.NORTH);
    c.add(panel2, BorderLayout.SOUTH);

    setSize(400, 400);
    setVisible(true);
  }
  public void actionPerformed(ActionEvent e)
  {
    int res = chooser.showOpenDialog(this);
    String fPath;

    // ボタンが押されたらFileChooserを開きファイルをロード
    if(e.getActionCommand() == "Open")
    {
      try
      {
        if (res == JFileChooser.APPROVE_OPTION)
        {
          File file = chooser.getSelectedFile();
          fPath = file.getAbsolutePath();

          tracker = new MediaTracker(this);

          ImageLoader loader = new ImageLoader();
          image = loader.getImage(fPath);

          tracker.addImage(image, 1);
          try
          {
            tracker.waitForID(1);
          }
          catch(InterruptedException err) {}

          // ここで何かしらのダイアログボックスを出すと画像はなぜか正常に表示されたままになる
          //JOptionPane.showMessageDialog(null, fPath); 
          g = panel1.getGraphics();
          g.drawImage(image, 0, 0, this); // 一瞬で消える
        }
      }
      catch(Exception ex){}
    }
  }
  private class ImageLoader extends ClassLoader
  {
    private Image getImage(String str)
    {
      Image image = Toolkit.getDefaultToolkit().createImage(str);
      return image;
    }
  }
}

シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-04-11 01:45
引用:

fuzukiさんの書き込み (2004-04-10 14:36) より:

コード:


public void paintComponent(Graphics g) // こんな感じでやればうまくいくかと思ったが失敗
{
g = panel1.getGraphics();
g.drawImage(image, 0, 0, this);
}





JFrame#paintComponent(Graphics)をオーバーライドするのではなくて、画像表示を行うJPanelの#paintComponent(Graphics)をオーバーライドしてみましょう。

コード:

public class MyPanel extends JPanel{
private Image image;
public void paintComponent(Graphics g){
g.drawImage(image,0,0,this);
}
}



省略している部分はそちらで補完してください。

[ メッセージ編集済み 編集者: シュン 編集日時 2004-04-11 01:46 ]
fuzuki
常連さん
会議室デビュー日: 2003/08/23
投稿数: 48
投稿日時: 2004-04-12 00:27
シュンさん 回答ありがとうございました。

アドバイスどおり、JPanelの中でpaintComponentを使用したところ、問題の箇所は全て解決しました。
1

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