我的一个 friend 请我帮助他使用 Swing,但我已经无法解决问题了。 所以,首先我有一个 ImagePanel
public class ImagePanel extends JPanel {
private Image img;
public void setImage(String img) {
setImage(new ImageIcon(img).getImage());
}
public void setImage(Image img) {
int width = this.getWidth();
int height = (int) (((double) img.getHeight(null) / img.getWidth(null)) * width);
this.img = img.getScaledInstance(width, height, Image.SCALE_SMOOTH);
}
@Override
public void paintComponent(Graphics g) {
g.drawImage(img, 0, 0, null);
}
}
还有一个 FileChooser
,它应该将所选图像打开到 ImagePanel 中。它只是调用ImagePanel
的setImage
。但图像不是画出来的。没有重绘、验证和无效帮助的组合。
但是,当调整 JFrame
大小(使用鼠标)时,会绘制图像。
所以,问题是 - 在调整大小(使用鼠标)时调用什么方法,这使得 ImagePanel
能够成功重绘。
最佳答案
IconImage 使用 MediaTracker 异步加载图像。当您调用重绘、无效等时,图像尚未完成加载。
在你的paintComponent中,替换
g.drawImage(img, 0, 0, null);
与
g.drawImage(img, 0, 0, this);
Component 类有一个 ImageObserver 的实现,当图像加载完成时,它将调用重绘。
关于java - 除非发生系统事件,否则图像面板不会重新绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1828712/