自定义摆动组件:repaint() 的问题
Posted
技术标签:
【中文标题】自定义摆动组件:repaint() 的问题【英文标题】:Custom swing component: Problem with repaint() 【发布时间】:2011-01-26 23:04:42 【问题描述】:我正在构建一个自定义摆动组件(更多的是作为一个实际的思想实验而不是其他任何东西)。
我在重绘时遇到问题。我的组件有一个jtree
、一个jtable
,然后是一个完全自定义绘制的部分(希望最终是相当 MS 项目式的甘特视图)
具体问题是当jtree展开时,table和gannt视图应该更新以反映新展开的treenode下的新子项目。他们这样做,但大小没有更新,所以表格没有显示额外的行,我的甘特显示也没有用完整个高度。
奇怪的是,如果我触摸jframe
上的窗口句柄(所以即使调整大小为 1px) - 这似乎会强制完全刷新,然后组件正确显示,中间的表格和甘特图在右侧填充显示。
如果我不进行调整大小,则在树中的节点展开/折叠时调用 repaint,因为我看到了 ganttview 更新,但它似乎没有展开以占据整个高度屏幕。
我在下面放了一个屏幕截图,它在顶部显示了 resize() 之后的正确显示,下半部分是我在不调整大小的情况下展开节点时看到的。
我的断言是组件知道如何正确地 repaint() 自己,因为它在调整大小时做了正确的事情,但这必须触发一个强制更全面刷新的特殊事件。我尝试了update
()、invalidate
()、repaint
() 的各种组合,但我似乎无法模拟调整父窗体大小时发生的完整repaint
()。
谢谢,王牌
【问题讨论】:
【参考方案1】:奇怪的是,如果我触摸 jframe 上的窗口句柄(甚至调整 1px 大小) - 这似乎会强制完全刷新,然后组件会正确显示,
当调整框架大小时,组件会重新验证并重新绘制。因此,您需要在代码中的某处(表格和甘特视图更新的地方)添加:
customComponent.revalidate();
customComponent.repaint();
【讨论】:
以上是关于自定义摆动组件:repaint() 的问题的主要内容,如果未能解决你的问题,请参考以下文章