我已经构建了一个扩展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 中创建的。 感谢任何帮助,提前谢谢!
答案 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);
}
此外,您可以通过删除ActionPerformed
和revalidate
来简化您的repaint
方法:
private void TILE_ITEMS_ActionPerformed(java.awt.event.ActionEvent evt) {
String path="/res/"+TILE_ITEMS.getSelectedItem().toString()+".png";
PREVIEW_PANEL.setPath2(path);
}