我的一个朋友让我帮助他解决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中。它只是调用setImage
的{{1}}。但图像没有画。没有repatint,验证和无效帮助的组合。
但是,在ImagePanel
调整大小(使用鼠标)时会绘制图像。
所以,问题是 - 在调整大小(使用鼠标)时调用了哪种方法,这使得JFrame
成功重新绘制。
答案 0 :(得分:3)
IconImage正在使用MediaTracker以异步方式加载图像。在您调用重绘,无效等的位置,图像尚未完成加载。
在paintComponent中,替换
g.drawImage(img, 0, 0, null);
带
g.drawImage(img, 0, 0, this);
Component类有一个ImageObserver实现,它将在图像加载完成后调用repaint。
答案 1 :(得分:1)
设置图像并在代码中绘制它不会改变组件的实际大小。根据包含框架的布局和设置,可能会发生一些不同的事情 - 您的ImagePanel最初可能大小为0x0,因此在放大框架并为ImagePanel分配更多空间之前不会显示;或者ImagePanel的手动大小不适合JFrame的起始大小,在这种情况下,在调整大小后可能无法显示ImagePanel。
答案 2 :(得分:0)
调用重绘方法(documentation link)将导致重新绘制面板。这会导致对paint进行底层调用,这也是导致JPanel在调整大小时进行绘制的原因。