2011-01-26 77 views
1

我正在构建一个自定义的swing组件(更像是一个实际的思想实验)。自定义swing组件:重绘问题()

我遇到了重新绘制的问题。我的组件具有jtree,一个jtable,然后就是完全自定义的画的一部分(希望结束了相当MS项目式的ganttview)

的具体问题是,当JTree的扩大,表和甘特视图应更新以反映新扩展的treenode下的新子项目。他们这样做,但尺寸不更新,所以表格不显示额外的行,而且我的gannt显示也没有使用完整的高度。

奇怪的是,如果我触摸jframe上的窗口句柄(所以即使是1px调整大小) - 这似乎强制完全刷新,然后组件显示正常,中间的表格和gannt正确填满显示屏。

如果我不做调整大小,那么当树中的节点展开/折叠时调用repaint,因为我看到ganttview更新,但它看起来并没有展开占据整个高度屏幕。

我已经在下面的屏幕截图中显示了resize()后的正确显示,下半部分是我看到如果我不扩大节点而不进行调整大小。

我的断言是,组件知道如何正确重绘()它本身,因为它在调整大小上做了正确的事情,但是这必须触发一个特殊事件来强制更新。我尝试过各种组合update(),invalidate(),repaint(),但似乎无法模拟父窗体调整大小时发生的完整repaint()。

Screenshot

感谢,王牌

回答

1

奇怪的是,如果我碰的窗口句柄上的JFrame(因此,即使1px的调整大小) - 这似乎强制完全刷新和组件然后正确显示,

当一个框架被调整大小时,组件被重新验证和重新绘制。因此,在你的代码中的某个地方(表格和gannt视图更新的地方),你需要添加:

customComponent.revalidate(); 
customComponent.repaint(); 
+0

很多谢谢,这样做的伎俩 – phatmanace 2011-01-27 22:56:02