0

このように宣言された画像を表示するJPanelの子を含むこのJFrameがあります。

BufferedImage image = ImageIO.read(filename);

プログラムは画像を正しく表示します。ただし、唯一のことは、画像を表示するためにフレームのサイズを変更する必要があるということです。

フレームが表示されたら画像を表示する方法はありますか?

4

2 に答える 2

3

その中に画像を上書き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。代わりに、私は完全に受け入れられるカスタムペイントを宣伝しました。

于 2011-07-06T13:30:33.047 に答える
1

Dispalyの場合ImageまたはImageIconはJLabel(基本的なもの)を探す方が良いです

于 2011-07-06T13:42:30.167 に答える