我已经在这个网站上看到过很多次了(比如这里,这里),你不能打电话 setVisible(true) 将组件添加到 JComponent ,但我还没有看到一个解释,网上的信息似乎也很少。为什么会这样,如果你违反了规则怎么办?
setVisible(true)
JComponent
b5buobof1#
如果您先调用它,则不会破坏任何内容,但如果您添加了任何内容,则可能需要再次调用它。否则swing不会渲染添加的组件。您需要让jvm调用jframe的 paint(...) 方法来渲染jframe的组件,以及 setVisible(true) 将要求jvm这样做。如果您在调用setvisible(true)之后添加了组件,但没有看到这些组件,那么您会发现,如果您调整jframe的大小,这些组件将“具体化”。这是因为重新调整它的大小会导致操作系统要求swing重新绘制gui,这将导致 paint(...) 被召唤。注意,如果在创建gui之后添加组件,可以调用 revalidate() 而且经常 repaint() 在它的容器上获得新组件的正确布局,然后进行渲染。这个 repaint() 如果组件中的更改涉及到删除,或者一个组件被绘制在另一个组件之前被可视化的地方,那么这是绝对必要的。我强烈推荐的一本书:肮脏的有钱客户买盖伊和哈斯。就买吧!你不会后悔的。
paint(...)
revalidate()
repaint()
3df52oht2#
放大@hovercraft的有用分析,你可能还需要重新考虑- pack() 封闭的顶层容器。此示例将元素添加到 JList 之后 setVisible() ,可以说明权衡。
pack()
JList
setVisible()
2条答案
按热度按时间b5buobof1#
如果您先调用它,则不会破坏任何内容,但如果您添加了任何内容,则可能需要再次调用它。否则swing不会渲染添加的组件。您需要让jvm调用jframe的
paint(...)
方法来渲染jframe的组件,以及setVisible(true)
将要求jvm这样做。如果您在调用setvisible(true)之后添加了组件,但没有看到这些组件,那么您会发现,如果您调整jframe的大小,这些组件将“具体化”。这是因为重新调整它的大小会导致操作系统要求swing重新绘制gui,这将导致paint(...)
被召唤。注意,如果在创建gui之后添加组件,可以调用
revalidate()
而且经常repaint()
在它的容器上获得新组件的正确布局,然后进行渲染。这个repaint()
如果组件中的更改涉及到删除,或者一个组件被绘制在另一个组件之前被可视化的地方,那么这是绝对必要的。我强烈推荐的一本书:肮脏的有钱客户买盖伊和哈斯。就买吧!你不会后悔的。
3df52oht2#
放大@hovercraft的有用分析,你可能还需要重新考虑-
pack()
封闭的顶层容器。此示例将元素添加到JList
之后setVisible()
,可以说明权衡。