图像路径更改时,JPanel中的图像未更新

时间:2017-10-24 18:24:28

标签: java swing user-interface jpanel

我已经构建了一个扩展JPanel的自定义类来绘制它。 到目前为止一切都那么好,当我创建它的对象时它渲染得很好。 当我改变路径时,问题就出现了,图像不会更新!我试过了重绘()& revalidate()方法,但它仍然不会更新.. 以下是该课程的来源:

public class Screen extends JPanel {
    private BufferedImage image;
    private String path2;

    public Screen(String path1) {
        path2=path1;
        try {
            image = ImageIO.read(getClass().getResourceAsStream(path2));
        } catch (IOException e) {
            e.printStackTrace();
        }
        revalidate();
        repaint();
    }

    @Override
    public void paint(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, image.getWidth() * 2, image.getHeight() * 2, null);
    }

    public void setPath2(String path) {
        this.path2 = path;
    }

    public String getPath2() {
        return path2;
    }
}

我正在使用Netbeans的GUI Builder,所以我还创建了一个在用户更改ComboBox值时调用的方法。 path1& path2变量改变了值,但图像不会更新.. ComboBox方法:

private void TILE_ITEMS_ActionPerformed(java.awt.event.ActionEvent evt) {    

    String path="/res/"+TILE_ITEMS.getSelectedItem().toString()+".png";
    PREVIEW_PANEL.setPath2(path);
    PREVIEW_PANEL.revalidate();
    PREVIEW_PANEL.repaint();        
}

要注意::对象是在我的GUI类源的TOP的TILE_ITEMS_ActionPerformed方法的 OUTSIDE 中创建的。 感谢任何帮助,提前谢谢!

2 个答案:

答案 0 :(得分:1)

你应该读取新路径的图像并将其放入图像变量然后重新绘制组件,这样你就应该从Screen构造器中复制代码然后将它放在set path方法中,因为如果你没有这样做,路径就会改变但是bufferedImage不会改变

答案 1 :(得分:1)

Screen课程中显示的图片未更新 因为在您的setPath2方法中,您错过了重新加载image (就像你在构造函数中正确完成的那样)。

固定的setPath2方法是这样的:

public void setPath2(String path) {
    this.path2 = path;
    try {
        image = ImageIO.read(getClass().getResourceAsStream(path2));
    } catch (IOException e) {
        e.printStackTrace();
    }
    revalidate();
    repaint();
}

修复此问题后,您可以像这样简化构造函数:

public Screen(String path1) {
    setPath2(path1);
}

此外,您可以通过删除ActionPerformedrevalidate来简化您的repaint方法:

private void TILE_ITEMS_ActionPerformed(java.awt.event.ActionEvent evt) {    

    String path="/res/"+TILE_ITEMS.getSelectedItem().toString()+".png";
    PREVIEW_PANEL.setPath2(path);
}