このように宣言された画像を表示するJPanelの子を含むこのJFrameがあります。
BufferedImage image = ImageIO.read(filename);
プログラムは画像を正しく表示します。ただし、唯一のことは、画像を表示するためにフレームのサイズを変更する必要があるということです。
フレームが表示されたら画像を表示する方法はありますか?
このように宣言された画像を表示するJPanelの子を含むこのJFrameがあります。
BufferedImage image = ImageIO.read(filename);
プログラムは画像を正しく表示します。ただし、唯一のことは、画像を表示するためにフレームのサイズを変更する必要があるということです。
フレームが表示されたら画像を表示する方法はありますか?
その中に画像を上書きpaintComponent(Graphics g)
して描画する必要があります。この場合、JPanel
コンポーネントに対してこれを行う必要があります(そうでない場合は、JComponent
参照している(s)に対してこれを行います)。また、Swingはスレッドセーフではないため、これらの変更がで実行されることを確認してEDT
ください。
例
public class Demo{
private static BufferedImage bi;
public static void main(String[] args){
try{
loadImage();
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){
createAndShowGUI();
}
});
}
catch (IOException e){
// handle exception
}
}
private static void loadImage() throws IOException{
bi = ImageIO.read(new File("src/resource/braveheart.PNG"));
}
private static void createAndShowGUI(){
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JPanel panel = new JPanel(){
@Override
protected void paintComponent(Graphics g){
Graphics g2 = g.create();
g2.drawImage(bi, 0, 0, getWidth(), getHeight(), null);
g2.dispose();
}
@Override
public Dimension getPreferredSize(){
return new Dimension(bi.getWidth(), bi.getHeight());
}
};
frame.add(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
出力
この例ではレンダリングヒントが無視されるため、を最大化するJFrame
と、画質が非常に低下することに注意してください。:)
編集
この質問に答えるとき、私はあなたがSwingの基本的な理解を持っていると思いました。想定しすぎたと思います。すべてのコンポーネントは、実現される前に(つまり、表示される前に)最上位のコンテナーに追加する必要があることに注意してください。これにより、フレームのサイズを変更せずにすべてが確実にレンダリングされます。他の人が示唆しているように、単にaJLabel
を使用して画像をレンダリングし、それをに追加することもできますJPanel
。代わりに、私は完全に受け入れられるカスタムペイントを宣伝しました。
Dispalyの場合ImageまたはImageIconはJLabel(基本的なもの)を探す方が良いです