我不喜欢这里的答案。
在我的职业生涯中,我从未见过 GridBagLayout 的有效用途。并不是说没有,只是我没见过 [有效的] 用途,可能有一些相关性。此外,将单个 JLabel 添加到 Container
的中间可能会使其居中以进行演示,但如果您尝试继续使用它而不是其他布局,则以后会更加困难。
我确实喜欢 BoxLayout 的建议,因为那是一个很好的方法。也就是说,那个答案只是谜题的一部分,这就是为什么我要挖掘一个七年前的问题。
我的“答案”
实际上,对于你的问题,没有简短的答案。根据你所问的问题,有一个确切的答案,但 StackOverflow 是关于社区互相学习的,我猜你想学习如何使用布局(或者你七年前想学习),告诉你输入一组键来完成你的演示案例并不能教你答案。
我将尽量避免解释任何你自己无法通过网络搜索找到答案的布局(但最后会提供一个指向Oracle教程的链接,因为我认为它相当好地解释了不同的布局)。
BoxLayout
BoxLayout是一种实现方法,上面已经有一个演示它的代码片段,所以我不会再提供一个。我会扩展一下,只回答了您的问题,但并没有真正教您什么。Box容器中被称为“Glue”的组件基本上给您在所有“Glue”之间提供平均的剩余空间。因此,如果您像这样做:
panel.add(Box.createHorizontalGlue());
panel.add(label);
panel.add(Box.createHorizontalGlue());
panel.add(otherLabel);
你会发现你的JLabel
不再居中,因为“glue”只是剩余的空间,在两个JLabels
被添加到Container
之后,这些空间将被平均分配给两个“插槽”(即在Container
中使用带有粘合参数的两个Container#add(Component)
调用)。
BorderLayout
BorderLayout是另一种方法。BorderLayout被分成5个区域。BorderLayout#CENTER
,正如你所想象的那样,是中心区域。关于这种布局和它如何居中的重要说明是它遵守位于中心的Component
的大小。我不会详细介绍这一点;如果你感兴趣,Oracle教程已经很好地涵盖了这一点。
值得注意的地方
我想你可以使用GridLayout
,但这是一个更简单的方法,比GridBagLayout
更简单,我已经说过,即使我认为这也不是一个好的方法。所以我也不会详细介绍这个。
所有这些的重点
说了这么多,我认为所有的布局管理器都值得一看。就像与编程有关的任何其他东西一样 - 使用适合工作的工具。不要仅仅因为你之前使用过X布局,就认为你应该总是使用X布局,而没有其他可行的布局方式。确定您想要的显示效果,以及您认为应如何调整组件大小,然后选择您认为最适合的。
另一个选择正确工具的双重意义在于,您不必只将所有组件适配到一个单独的容器
中,并使一个布局执行所有操作。没有什么能阻止您(我强烈鼓励您这样做)使用多个容器
并将它们全部分组。对每个显示区域使用适当的布局控制每个容器
,并对不同的容器
使用不同的布局。
重要!!
这个非常重要的原因是因为每个布局都有它们遵循的规则和事项,以及其他它们尊重的事项,还有一些实际上被忽略的事项(例如首选、最大和最小大小)。如果你正确地使用不同的布局,你会发现你的显示屏可以动态地被调整大小,同时仍然遵守你想要保持的形状。这是正确做法和只满足于GridBagLayout之间非常重要的关键区别。
JPanel outer = new JPanel(new BorderLayout());
JPanel centerPanel = new JPanel();
centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.PAGE_AXIS));
JPanel southPanel = new JPanel(new CardLayout());
outer.add(centerPanel, BorderLayout.CENTER);
outer.add(southPanel, BorderLayout.SOUTH);
找出适合您场景的内容,并选择它。除非您想要一些过于繁琐并被其他布局所取代的东西,否则没有一种大小适合所有。
Oracle的教程
如果您已经走到了这一步,那么我认为您正在寻找尽可能多的信息。在这种情况下,我强烈建议您阅读Oracle的布局管理器教程,因为它很好地概述了它们的一般细节:https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html