为什么我不应该在添加组件之前调用setVisible(true)?

时间:2012-05-28 21:11:21

标签: java swing

我已经多次(例如herehere)在此网站上看到它,在向{{{{}}添加组件之前,您不得调用setVisible(true) 1}},但我没有看到解释,互联网上的信息似乎很少。

为什么会出现这种情况,如果违反规则会发生什么?

2 个答案:

答案 0 :(得分:19)

如果你先打电话,你不会破坏任何东西,但如果你添加了任何东西,你可能需要再次打电话。 Else Swing不会渲染添加的组件。您需要让JVM调用JFrame的paint(...)方法来呈现JFrame的组件,setVisible(true)将要求JVM执行此操作。如果您在调用setVisible(true)之后添加了组件并且没有看到组件,那么如果重新调整JFrame的大小,您会发现它们将“实现”。这是因为重新调整大小会导致操作系统要求Swing重新绘制GUI,这将导致调用paint(...)

请注意,如果在创建GUI后添加组件,则可以在其容器上调用revalidate()并经常repaint()来正确布局新组件然后呈现。如果组件中的更改涉及删除,或者正在绘制其中另一个组件之前可视化的组件,那么repaint()肯定是

一本书建议我 高度 建议:Filthy Rich Clients购买Guy and Haase。买吧!你不会后悔购买。

答案 1 :(得分:7)

放大@Hovercraft的有用分析,您可能还需要重新pack()封闭的顶级容器。这个example会在JList之后向setVisible()添加元素,这可以说明权衡取舍。