【问题标题】:Java - repaint(x, y, w, h) doesn't call paintComponent? [duplicate]Java - repaint(x, y, w, h) 不调用paintComponent? [复制]
【发布时间】:2012-02-15 02:42:00
【问题描述】:

可能重复:
Java - repaint(x, y, w, h) doesn't call paintComponent? (with SSCCE)

我正在尝试这个整洁的性能技巧repaint(x, y, w, h),它确实对性能有很大帮助。

不幸的是,我在同一班级的paintComponent 中添加的特殊附加内容现在没有被绘制。我在paintComponent 的开头放了一个System.out.println() 测试,结果发现它甚至没有被调用(正如我们精明的读者可能从本段的开头想到的那样)。当我使用普通的repaint() 时,会调用paintComponent(),没问题。

具体来说,我有一个带有mouseListener 的JLabel,它在mouseEnter 上重新绘制标签。

有什么关系?我希望我错过了一些东西,这仍然可能吗?额外的性能确实不错...

【问题讨论】:

标签: java swing repaint paintcomponent


【解决方案1】:

repaint() 实际上是一个调用repaint(0, 0, width, height) 的单行代码,因此您的基本论点——带参数的repaint() 与不带参数的repaint() 根本不同——可证明是错误的。如果我是一个赌徒,我敢打赌您传递给此方法的参数描述了一个面积为零的区域(即宽度 RepaintManager 只是忽略了请求。

您可以通过将参数更改为已知良好的常量值来证明这一点,或者只是println() 在传递参数之前将它们的值。

【讨论】:

  • +1 的帮助 - 谢谢,这正是我想要的。实际上确实打印出来并得到了 x、y、w 和 h 的非零值。我没有得到的是实际paintComponent方法中的输出......这导致我的论文:P
  • 还有 - 当我将 xy 重绘更改为普通重绘时,paintComponent 中的打印确实会给出输出。
  • 另外,我主要寻找的是确认“是的,应该在这些情况下调用paintComponent 方法”或“不,脏区域是使用paint 组装的”或其他内容。
  • @Steve:不能保证每次调用paint方法都会调用paintComponent,即使使用默认方法也是如此。绘制管理器会将绘制请求排队到绘制队列中,但是如果队列被备份,一些绘制将不会完成。
  • @Hovercraft - 有趣。那么,这是否会是其中一种无法/应该覆盖paint() 的情况?
【解决方案2】:

你可以使用JComponent#paintImmediately

1) 确保通过使用 / 包装到 Swing GUI 来测试您的输出

if (SwingUtilities.isEventDispatchThread()) {

否则你可以得到exception from RepaintManager

2) repaint() 可以默认调用 EDT,直到第一个 Thread#sleep(int) 被调用

3) 从Swing Timer 调用绘画代码,输出将在 EDT 上,但如果调用 Thread#sleep(int),Timer 也不起作用

【讨论】:

  • 感谢 mKorbel,但实际上解决了一个重复的问题。 Mods 尚未批准我删除此问题的请求。不过有一个+1的麻烦。 :)
猜你喜欢
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
  • 2015-08-26
  • 2013-12-13
  • 2021-07-18
相关资源
最近更新 更多