除非系统事件,否则图像面板不会重新绘制

时间:2009-12-01 20:31:14

标签: java swing

我的一个朋友让我帮助他解决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成功重新绘制。

3 个答案:

答案 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在调整大小时进行绘制的原因。