【问题标题】:Image does not appear in JPanel using BufferedImage使用 BufferedImage 的图像未出现在 JPanel 中
【发布时间】:2013-08-26 02:58:13
【问题描述】:

我有一个带有已创建 JPanel 和“开始”按钮的 GUI。我所需要的只是当我单击“开始”时,图像将被加载并出现在该 JPanel 上。 但我的问题是当我单击“开始”时,什么也没有发生。 谁能帮我解决这个问题? 这是我的代码:

private BufferedImage image;
public class ImagePanel extends JPanel {
    public ImagePanel() {
        try {
            image = ImageIO.read(new File("C:\\Users\\HienTran\\Desktop\\Miranda-Kerr-16-240x320.jpg"));
        } catch (IOException ex) {
        // handle exception...
        }
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, null);
    }
}

private void startBtnActionPerformed(java.awt.event.ActionEvent evt) {                                         
    stopBtn.setEnabled(true);
    startBtn.setEnabled(false);
    imageArea.add(new ImagePanel());    // imageArea is the JPanel in the GUI
}

当我通过如下创建一个新的 JFrame 来替换 2 行 imageArea 时,该 JFrame 与我添加的图像一起显示。

private void startBtnActionPerformed(java.awt.event.ActionEvent evt) {                                         
    stopBtn.setEnabled(true);
    startBtn.setEnabled(false);
    JFrame test = new JFrame("Window"); 
    test.add(new ImagePanel()); 
    test.setSize(image.getWidth(), image.getHeight() + 30); 
    test.setVisible(true);
}

【问题讨论】:

    标签: java image swing jpanel bufferedimage


    【解决方案1】:

    当您将组件添加到可见的 GUI 时,基本代码是:

    panel.add(...);
    panel.revalidate();
    panel.repaint();
    

    但是,这可能无济于事,因为默认情况下 JPanel 使用 FlowLayout 并且 FlowLayout 尊重组件的大小。由于您没有覆盖 getPreferredSize() 方法,因此您的 ImagePanel 的大小将为 (0, 0)。

    无需创建自定义面板来绘制图像。只需使用JLabelIcon,然后您就可以让标签担心大小。不要重新发明轮子。

    我建议您阅读Swing tutorial 了解基础知识。也许How to Use Labels 上的部分将是一个很好的起点。本教程还将向您展示一种更好的方法来设计您遵循 Swing 指南的类。

    【讨论】:

    • 很抱歉创建了新问题 :( 我按照你说的尝试了 JLabel,但它仍然无法解决我的问题。图像仍然没有出现在 JPanel 中
    • @user2716653 说它不起作用并没有给我们任何信息。你需要发一个SSCCE
    • @user2716653 :问题可能是找不到图像,如果是这种情况,请尝试在 catch 块中写入ex.printStackTrace(),并查看堆栈跟踪(如果有),这可能可以提供更多细节:-)
    • @nIcEcOw,另一个答案已经暗示了这一点。 OP还表示直接添加到框架时会显示图像。同样,OP 需要学习如何提出正确的问题,这意味着发布 SSCCE,这样我们就不会一直猜测。
    • @camickr :太真实了,我也在克制自己,避免进一步的猜测工作,尽管也赞成另一个答案,以强调对 Stack Trace 的需要:-)
    【解决方案2】:

    先修正一下:

        try {
            image = ImageIO.read(new File("C:\\Users\\HienTran\\Desktop\\Miranda-Kerr-16-240x320.jpg"));
        } catch (IOException ex) {
            ex.printStacktrace(); // see if there is an exception, like not finding or something
        }
    

    比: 如果添加面板,则需要刷新布局和 gui:

    imageArea.add(new ImagePanel()); 
    imageArea.revalidate(); // refresh layout
    imageArea.repaint(); // shedule painting
    

    【讨论】:

    • 奇怪,我试过了。 catch 异常中没有出现任何内容,所以我认为没有任何异常。添加了 revalidate() 和 repaint() 但它仍然不起作用...... :(
    • @user2716653 比您在布局中添加不可见的新组件。设置一个新的 BorderLayout() 并将其添加到 Center Constaints,也许你有一个 NullLayout 左右
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    相关资源
    最近更新 更多