解决常见的布局问题

Note:

本课涵盖了手工编写布局代码,这可能会很困难。如果您不希望了解布局 管理 的所有详细信息,则可能更喜欢将GroupLayout布局 管理 器与构建器工具结合使用来布局 GUI。 NetBeans IDE是此类构建器工具之一。否则,如果您想手工编码并且不想使用GroupLayout,那么推荐使用GridBagLayout作为下一个最灵活,功能最强大的布局 管理 器。

如果您对使用 JavaFX 创建 GUI 感兴趣,请参阅在 JavaFX 中使用布局

问题: 如何指定组件的确切尺寸?

  • 一些较新的布局 管理 器提供了一些方法来覆盖由组件设置的大小。检查您使用的布局 管理 器是否允许您指定组件尺寸。

  • 确保您确实需要设置组件的确切大小。每个 Swing 组件都有不同的首选大小,具体取决于它使用的字体以及外观。因此,通常没有必要指定 Swing 组件的确切大小。

  • 如果组件不受布局 管理 器控制,则可以通过在其上调用setSizesetBounds方法来设置其大小。否则,您需要提供尺寸提示,然后确保您使用的布局 管理 器尊重尺寸提示。

  • 如果扩展了 Swing 组件类,则可以通过重写组件的getMinimumSizegetPreferredSizegetMaximumSize方法来提供大小提示。这种方法的好处是,每个getXxxxSize方法都可以通过调用super.getXxxxSize()获得组件的默认大小提示。然后,可以在返回之前调整大小(如果需要)。这对于文本组件特别方便,您可能需要固定宽度,但要根据内容确定高度。但是,有时GridBagLayout和文本字段会遇到问题,其中如果容器的大小小于首选大小,则会使用最小大小,这会导致文本字段显着缩小。

  • 提供大小提示的另一种方法是调用组件的setMinimumSizesetPreferredSizesetMaximumSize方法。

  • 如果您为已经可见的组件指定新的尺寸提示,则需要在其上调用revalidate方法,以确保再次布置其包含层次结构。然后调用repaint方法。

Note:

无论您如何指定组件的大小,请确保组件的容器使用的布局 管理 器尊重组件的请求大小。 FlowLayoutGridBagLayout管理 器使用组件的首选大小(后者取决于您设置的约束),但是BorderLayoutGridLayout通常不使用。 BoxLayout管理 器通常使用组件的首选大小(尽管组件可以更大),并且是少数几个尊重组件最大大小的布局 管理 器之一。

问题: 将我的组件添加到容器后,它没有出现。

  • 添加组件后,您需要先调用revalidaterepaint,然后它才能显示在您的容器中。

问题: 我的自定义组件尺寸过小。

  • 组件是否实现getPreferredSizegetMinimumSize方法?如果是这样,它们是否返回正确的值?

  • 您是否正在使用可以使用可用空间的布局 管理 器?有关选择布局 管理 器并指定它使用特定组件的最大可用空间的一些提示,请参见选择布局 管理 器的提示

如果在此列表中没有看到您的问题,请参阅解决常见组件问题