问题绘画BufferedImage

时间:2013-04-02 15:38:21

标签: java swing jpanel bufferedimage paintcomponent

我正在开发一个将图像文件夹读入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);
    }

}

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

1 个答案:

答案 0 :(得分:1)

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

将组件添加到可见GUI时,代码应为:

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

创建所有组件的大小为(0,0),因此无需绘制任何内容。 revalidate()调用布局管理器,布局管理器又为compoenent提供大小。

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