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

标签 java swing

我的一个 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 中。它只是调用ImagePanelsetImage。但图像不是画出来的。没有重绘、验证和无效帮助的组合。

但是,当调整 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/

相关文章:

java - 是否可以在 build.xml 中使用网站上的 jar?

java - 从文本区域生成可点击事件

java - 当我向 Jpanel 添加按钮时 KeyListener 不起作用

java - 将 HashMap 与 jcombobox 同步

java - 如何在 *ComponentUI 类(Swing 应用程序)中设置默认首选大小(重新定义 UI)?

java - JSF 更新 p :selectOneMenu from another p:selectOneListbox with Ajax

java - 在java中使用do-while重新启动游戏

java - 与 Selenium Grid 并行运行 TestNG 套件

java - 为什么我收到 "The constructor Intent(Class<LivrmStartActivity>) is undefined"消息?

java - Swing Worker 覆盖进程 <T,V>