web-dev-qa-db-ja.com

JFrame内のJPanelへの画像の描画

私はJFrame内に2つのJPanelsを含むプログラムを設計しています。1つは画像を保持するためのもので、もう1つはGUIコンポーネント(検索フィールドなど)を保持するためのものです。 JFrame内の最初のJPanelに画像を描画するにはどうすればよいですか。

これが私のコンストラクタからのサンプルコードです:

public UITester() {
    this.setTitle("Airplane");
    Container container = getContentPane();
    container.setLayout(new FlowLayout());
    searchText = new JLabel("Enter Search Text Here");
    container.add(searchText);
    imagepanel = new JPanel(new FlowLayout());
    imagepanel.paintComponents(null);
   //other constructor code

}

public void paintComponent(Graphics g){
    super.paintComponents(g);
    g.drawImage(img[0], -50, 100, null);
}

JPanelのpaintComponentメソッドをオーバーライドして画像をペイントしようとしましたが、これを作成しようとすると、コンストラクターで問題が発生します。

imagepanel.paintComponents(null);

それは私がメソッドnを渡すことのみを許可し、グラフィックスgを渡さないので、誰でもこのメソッドまたはJPanelで画像を描画するために使用できる別のメソッドの修正を知っていますか?助けていただければ幸いです! :)

よろしくお願いします。マット

9
MattTheHack

もっと簡単な方法を提案したいのですが、

  image = ImageIO.read(new File(path));
  JLabel picLabel = new JLabel(new ImageIcon(image));

イェイ!これで画像がSwingコンポーネントになりました。フレームやパネルなど、普段と同じように追加してください。おそらく、次のような再ペイントも必要です

  jpanel.add(picLabel);
  jpanel.repaint(); 
14
COD3BOY

JLabel.setIcon() を使用して、画像をJPanelに here のように配置できます。

一方、背景付きのパネルが必要な場合は、 this チュートリアルをご覧ください。

7
npinti

コンストラクタから手動でpaintComponent()を呼び出す必要はありません。問題は、Graphicsオブジェクトにnullを渡すことです。代わりに、paintComponent()をオーバーライドし、ペイントに使用するメソッドに渡されたGraphicsオブジェクトを使用します。これをチェックしてください チュートリアル 。以下は、画像付きのJPanelの例です。

class MyImagePanel extends JPanel{ 
    BufferedImage image;
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        if(image != null){
            g.drawImage(image, 0, 0, this);
        }
    }
}
6
tenorsax