【问题标题】:Issue painting BufferedImage发行绘画BufferedImage.
【发布时间】:2013-03-23 23:51:01
【问题描述】:

我正在开发一个程序,它将图像文件夹读取到 JList 中,并且在 JList 中选择的图片将被绘制到 JPanel 中。我有两个类:ImageViewerPanel,它创建面板来显示所选图片。然后我有ImageViewerUI 将绘制JList,ImageViewerPanel 将添加到ImageViewerUI 类中。这是来自ImageViewerPanel 类的相关代码。

public ImageViewerPanel() {
    initComponents();
}

public void setImage(BufferedImage image) {
    this.image = image;
    repaint();
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    if (scaled == false) {
        g.drawImage(image, 0, 0, null);
    }else if(scaled == true) {
        g.drawImage(image, 0, 0, 80, 80, null);
    }

这是来自ImageViewerUI 类的代码,用于用图像刷新面板:

    ImageViewerPanel imagePanel = new ImageViewerPanel();
    BufferedImage displayedImage;
    BufferedImage originalImage;

public ImageViewerUI() {
    initComponents();
    loadListWithImageFilenames();
    updateImagePanel();
    updateThumbnailImagePanel();
}

public final void updateImagePanel() {
    try {
        String currFile = (String) ("Images/" + imageList.getSelectedValue());
        displayedImage = ImageIO.read(new File(currFile));
        imagePanel.setImage(displayedImage);
    } catch (IOException ex) {
        Logger.getLogger(ImageViewerUI.class.getName()).log(Level.SEVERE, null, ex);
    }

public final void updateThumbnailImagePanel() {
    try {
        String currFile = (String) ("Images/" + imageList.getSelectedValue());
        originalImage = ImageIO.read(new File(currFile));
        imagePanel.setScaled(true);
        imagePanel.setImage(originalImage);
        imageViewerPanel1.add(imagePanel);
        imagePanel.repaint();
    } catch (IOException ex) {
        Logger.getLogger(ImageViewerUI.class.getName()).log(Level.SEVERE, null, ex);
    }

}

我遇到的问题是图像未显示在面板中。有人知道为什么吗?

【问题讨论】:

  • 为了更好的帮助,请尽快发布SSCCE,简短,可运行,可编译,create an BufferedImage on the fly
  • 我们需要一个小的完整可运行示例代码来帮助您。一方面,这似乎没有任何意义:imageViewerPanel1.add(imagePanel);。为什么每次插入缩略图时都将图像面板添加到布局中?
  • 如果有人能想出一种方法来使 Swing 代码简短、独立且可运行。可运行代码可以通过运行来调试。
  • @mKorbel 我已经查看了有关此主题的多个问题,但没有一个对我有帮助。
  • @Gene 我只是尽我所能让它显示图片。另外,如果有帮助,我添加了我的构造函数。

标签: java swing jpanel bufferedimage paintcomponent


【解决方案1】:
imageViewerPanel1.add(imagePanel);
imagePanel.repaint();

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

imageViewerPanel1.add(imagePanel);
//imagePanel.repaint();
imageViewerPanel1.revalidate();
imageViewerPanel1.repaint();

所有组件都以 (0, 0) 的大小创建,因此没有可绘制的内容。 revalidate() 调用布局管理器,后者又为组件提供大小。

如上所述,您还需要覆盖 imagePanel 的 getPreferredSize() 方法,以便布局管理器可以确定面板的正确大小。

【讨论】:

  • @DarthCthulhu 然后使用CardLayout 而不是container.revalidate()container.repaint()
猜你喜欢
  • 1970-01-01
  • 2022-01-21
  • 2015-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
相关资源
最近更新 更多