Java 更改图像路径时未在JPanel中更新图像
我已经构建了一个自定义类,扩展了JPanel以在其中进行绘制。 到目前为止还不错,当我为它创建一个对象时,它的渲染效果很好。 问题来了,当我改变路径,图像将不会更新!我尝试了repaint()和revalidate()方法,但仍然无法更新。。 以下是该类的来源: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
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);
}
当给出的答案帮助你解决问题时,你应该接受其中一个。看见