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

Tha*_*wen 10 java swing

我已经看过它在这个网站上写了很多次(比如这里这里)你setVisible(true)在向a添加组件之前一定不能打电话JComponent,但我还没有看到解释,互联网上的信息似乎很少.

为什么会这样,如果违反规则会发生什么?

Hov*_*els 19

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

请注意,如果在创建GUI后添加组件,则可以调用revalidate()并经常repaint()在其容器上调用正确布局的新组件,然后进行渲染.该repaint()绝对是必要的,如果在组件更改涉及的删除或正在绘制的部件,其中另一个组件之前显现.

强烈推荐的一本书建议:肮脏的富客户购买Guy and Haase.买吧!你不会后悔购买.


tra*_*god 7

放大@Hovercraft的有用分析,您可能还需要重新pack()封闭顶级容器.这个例子,这增加了元件的JListsetVisible(),可示出的权衡.