Java 更改图像路径时未在JPanel中更新图像

Java 更改图像路径时未在JPanel中更新图像,java,swing,user-interface,jpanel,Java,Swing,User Interface,Jpanel,我已经构建了一个自定义类,扩展了JPanel以在其中进行绘制。 到目前为止还不错,当我为它创建一个对象时,它的渲染效果很好。 问题来了,当我改变路径,图像将不会更新!我尝试了repaint()和revalidate()方法,但仍然无法更新。。 以下是该类的来源: public class Screen extends JPanel { private BufferedImage image; private String path2; public Screen(Str

我已经构建了一个自定义类,扩展了JPanel以在其中进行绘制。 到目前为止还不错,当我为它创建一个对象时,它的渲染效果很好。 问题来了,当我改变路径,图像将不会更新!我尝试了repaint()和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构建器,因此我还创建了一个方法,当用户更改ComboBox值时调用该方法。path1和path2变量会更改值,但图像不会更新。。 组合框方法:

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();        
}
需要注意的是:该对象是在TILE\u ITEMS\u ActionPerformed方法的外部创建的,位于my GUI类源代码的顶部。。
感谢您的帮助,提前谢谢

您应该读取新路径的图像并将其放入image变量中,然后重新绘制组件,这样您就应该从屏幕构造函数中复制代码,然后将其放入set path methode中,因为如果不这样做,路径将更改,但buffereImage不会更改
屏幕
类中显示的图像没有更新
因为在您的
setPath2
方法中,您没有重新加载
图像
(就像你在构造函数中正确地做的那样)

固定的
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);
}
修复此问题后,您可以简化构造函数,如下所示:

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);
}
此外,您还可以通过删除
revalidate
repaint
来简化
ActionPerformed
方法:

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

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

当给出的答案帮助你解决问题时,你应该接受其中一个。看见