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

对于显示ImageImageIcon更好地寻找JLabel(基本的东西)

于 2011-07-06T13:42:30.167 回答