帧大小时的JFrame图像显示

时间:2011-07-06 12:56:04

标签: java swing jframe bufferedimage javax.imageio

我有这个包含JPanel子节点的JFrame,其中显示以这种方式声明的图像。

BufferedImage image = ImageIO.read(filename);

程序正确显示图像。但唯一的是,它需要调整帧的大小以显示图像。

框架出现后是否有可能显示图像?

2 个答案:

答案 0 :(得分:3)

您应该覆盖paintComponent(Graphics g)并在其中绘制图像。在这种情况下,您应该为JPanel组件执行此操作(我认为?如果不是,请对您所指的JComponent执行此操作)。此外,由于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);
    }
}

<强>输出

enter image description here

重要的是要记住,此示例忽略了渲染提示,因此当您最大化JFrame时,图像质量将非常差。 :)

修改

在回答这个问题时,我认为你对Swing有了基本的了解。我想我假设太多了。值得一提的是,在实现(即可见)之前,应将所有组件添加到顶级容器中。这将确保在不必调整框架大小的情况下渲染所有内容。正如其他人所建议的那样,您可以简单地使用JLabel呈现图片,然后将其添加到JPanel。相反,我推广自定义绘画,这是完全可以接受的,对我来说,更清洁。

答案 1 :(得分:1)

显示ImageImageIcon

更适合JLabel(基本内容)