如何检查谁在 Swing 中提交了 repaint() 事件?
How to check who submitting repaint() event in Swing?
我编写了一个扩展 JPanel 并覆盖其 paint() 方法的自定义组件。现在我可以看到这个方法在组件显示时每 10 毫秒调用一次。组件没有任何变化,但 paint() 仍然被调用。我有几个调用 repaint() 但实际上调用了 none 个。如何知道是什么导致了如此频繁的更新?
更新!
我的代码中有 "bug"。我正在从 paint() 方法更新内部组件,所以这是持续重绘的根本原因。
但是,问题仍然没有得到解答:如何理解是什么向队列提供事件?
使用调试
在 paint() 函数中打断点
当它调用时,您可以查看回调的堆栈跟踪
how to understand what supplies events to the queue?
只要 Swing 组件的 属性 发生变化,该组件就会自动调用 repaint()
自身。绘画请求被传递给 RepaintManager
。
然后 RepaintManager
会将多个重绘请求整合到所有组件的单个绘制中。合并是为了让绘画更有效率。
因此发出请求的单个组件不可用,因为在许多情况下多个组件会同时发出重绘请求。
您可以阅读 Painting in AWT and Swing 以获得更详细的解释。
我编写了一个扩展 JPanel 并覆盖其 paint() 方法的自定义组件。现在我可以看到这个方法在组件显示时每 10 毫秒调用一次。组件没有任何变化,但 paint() 仍然被调用。我有几个调用 repaint() 但实际上调用了 none 个。如何知道是什么导致了如此频繁的更新?
更新! 我的代码中有 "bug"。我正在从 paint() 方法更新内部组件,所以这是持续重绘的根本原因。 但是,问题仍然没有得到解答:如何理解是什么向队列提供事件?
使用调试 在 paint() 函数中打断点 当它调用时,您可以查看回调的堆栈跟踪
how to understand what supplies events to the queue?
只要 Swing 组件的 属性 发生变化,该组件就会自动调用 repaint()
自身。绘画请求被传递给 RepaintManager
。
然后 RepaintManager
会将多个重绘请求整合到所有组件的单个绘制中。合并是为了让绘画更有效率。
因此发出请求的单个组件不可用,因为在许多情况下多个组件会同时发出重绘请求。
您可以阅读 Painting in AWT and Swing 以获得更详细的解释。