【问题标题】:Java swing won't display g.drawImage() until repaint() is called在调用 repaint() 之前,Java swing 不会显示 g.drawImage()
【发布时间】:2015-06-01 04:45:01
【问题描述】:
@Override
public void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    super.paintComponent(g2);

    g2.fillRect(20, 20, 200, 200);
    g2.drawImage(map, 0, 0, 1004, 687, null);
}

这是我的 JPanel 中paintComponent 的代码。

当应用程序启动时,我可以看到矩形(这只是因为我想检查是否调用了paintComponent)。但是在我通过调整窗口大小或按下强制重绘() 的按钮强制重绘之前,地图不会绘制

我尝试在几个地方调用 validate(),因为一些答案表明了这一点,但它不起作用。

【问题讨论】:

  • 如何获得map?你在用ImageIO.read(...)吗?请注意,validate() 不应该在这里做任何事情,因为它与重新绘制组件无关,而是与布局其子组件(如果有)相关。
  • 我将地图作为私有字段,在创建 JPanel 对象时实例化。所以,我有 private Image map = Toolkit.getDefaultToolkit().getImage("src/hw8/data/campus_map.jpg");
  • 如果你使用ImageIO.read(new File(...))会发生什么?
  • 永远不要使用任何带有“src”的路径,导出项目时该路径将不存在。

标签: java swing paintcomponent repaint drawimage


【解决方案1】:
g2.drawImage(map, 0, 0, 1004, 687, null);

尝试使用:

g2.drawImage(map, 0, 0, 1004, 687, this);

可能在调用paintComponent() 方法时图像并未完全读取。 “this”将导致在 I/O 完成时绘制图像。也就是说,面板将被通知 I/O 已完成,并且面板将自行重新绘制。

【讨论】:

    猜你喜欢
    • 2013-06-21
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 2010-11-09
    • 2013-03-02
    • 2015-03-30
    • 1970-01-01
    相关资源
    最近更新 更多