1

在我正在开发的 Swing 应用程序中进行重新绘制时,我遇到了一些奇怪的问题。我发现当我设置某个组件的文本(它只是窗口最底部的状态栏文本标签)时,屏幕非常不同区域的整个表格被告知重新绘制。这会导致一些性能问题,因为每次我设置状态栏文本时,基本上整个窗口都被要求重新绘制。

我一直在 RepaintManager 周围徘徊,试图弄清楚发生了什么,并发现当我尝试设置此文本的标签时,我的整个主 JPanel 都被标记为脏组件。但是,我在调试发生的时间点以及发生这种情况的确切原因时遇到了麻烦。我试图阅读重绘系统,但我无法确定为什么在设置其他文本标签时需要对非重叠表进行重绘。

我使用 Swing Explorer 尝试可视化布局边​​框,以确保事物不会以某种疯狂的方式重叠,并且一切看起来都很好。

我正在寻找一种方法来确定要求 JTable 重新绘制的调用顺序。当我在它的paintComponent() 上添加一个断点并沿着堆栈向上走时,我最终进入了RepaintManager 的paintDirtyRegions() 调用,其中我的整个主JPanel(包含窗口中的所有内容)都位于tmpDirtyComponents 变量中。

当我最初只是设置一个状态文本标签时,谁能解释我的整个 JPanel 是如何被标记为脏的?如果没有,您能否提供一些关于在哪里找到错误的指导?

非常感谢您提供的任何帮助!

4

3 回答 3

1

每当您更改 Swing 组件的属性时,都会在组件上调用 revalidate() 和 repaint()。设置文本会导致组件的首选大小发生变化,因此需要调用布局管理器并重新绘制整个面板。

我不知道如何解决这个问题。

于 2011-03-21T01:49:35.003 回答
1

不知何故,我设法通过更改我的布局管理器来绕过这个问题。我的主面板使用的是 GroupLayout。由于整个 GroupLayout 非常简单,我决定尝试使用 BorderLayout,将 JPanel 中的主窗口内容添加到 BorderLayout.CENTER,并将状态栏标签添加到 BorderLayout.PAGE_END。当我设置状态标签文本时,它修复了整个窗口的奇怪失效和重绘!感谢大家的好建议!

于 2011-03-21T02:11:41.763 回答
1

只是添加到 camickr 的评论中,为麻烦的组件覆盖 isValidateRoot() 是解决此问题的正确解决方案,并且通常是解决不必要的重绘问题的正确解决方案。

缺点是,如果对 isValidateRoot 组件的更改确实需要组件更改大小,则需要手动强制重新验证(myValidateRoot.getParent().invalidate() 应该这样做)。

于 2016-07-17T09:33:31.597 回答