自定义swing组件:重绘问题()

时间:2011-01-26 23:04:43

标签: java swing custom-component

我正在构建一个自定义的摇摆组件(更像是一个实用的思想实验而不是其他任何东西)。

我在重新粉刷方面遇到了问题。我的组件有一个jtree,一个jtable,然后是一个完全自定义绘制的部分(希望最终成为一个非常MS项目式的ganttview)

具体问题是当jtree扩展时,表和gannt视图应该更新以反映新扩展的treenode下的新子项目。他们这样做,但大小没有更新,所以表格没有显示额外的行,我的gannt显示也没有用完全高。

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

如果我没有进行调整大小,那么当树中的节点被展开/折叠时会调用重绘,因为我看到了ganttview更新,但它似乎没有扩展到占据整个高度屏幕。

我在下面输入了一个屏幕截图,其中显示了调整大小()后面的正确显示,以及下半部分,这是我在没有调整大小的情况下展开节点时看到的内容。

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

Screenshot

谢谢你,Ace

1 个答案:

答案 0 :(得分:1)

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

调整框架大小时,组件将重新生效并重新绘制。因此,在代码中的某处(表和gannt视图的更新),您需要添加:

customComponent.revalidate();
customComponent.repaint();