本教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
有关Java SE 9及后续版本中更新的语言特性的摘要,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能以及删除或弃用选项的信息,请参阅JDK发行说明。
尽管可以不使用布局管理器,但如果可能的话,应该尽量使用布局管理器。布局管理器使得调整组件外观(与外观相关)、不同字体大小、容器大小变化和不同语言环境更加容易。布局管理器也可以轻松地被其他容器和程序重用。
GroupLayout布局管理器结合构建工具来布局您的GUI。其中一种构建工具是NetBeans IDE。否则,如果您想手动编码而不想使用GroupLayout,那么GridBagLayout被推荐作为下一个最灵活和强大的布局管理器。
如果您有兴趣使用JavaFX来创建GUI,请参阅在JavaFX中使用布局。
如果一个容器中的组件的大小不受容器的大小、字体、外观或语言的影响,则绝对定位可能是合理的。桌面窗格(包含内部窗体)属于此类别。内部窗体的大小和位置不直接取决于桌面窗格的大小。程序员确定内部窗体在桌面窗格中的初始大小和位置,然后用户可以移动或调整窗体的大小。在这种情况下,布局管理器是不必要的。
另一种适用于绝对定位的情况是自定义容器,它执行对容器特定的大小和位置计算,并可能需要了解容器的特殊状态。这就是分割窗格的情况。
创建一个没有布局管理器的容器涉及以下步骤。
setLayout(null)将容器的布局管理器设置为null。Component类的setbounds方法。Component类的repaint方法。但是,如果包含容器的窗口调整大小,使用绝对定位的容器可能会导致问题。
这是一个内容窗格使用绝对定位的框架的快照。
点击"启动"按钮使用Java™ Web Start运行AbsoluteLayoutDemo(下载JDK 7或更高版本)。或者,要自己编译和运行示例,请参考示例索引。
其代码位于AbsoluteLayoutDemo.java。下面的代码片段显示了如何创建和布局内容窗格中的组件。
pane.setLayout(null);
JButton b1 = new JButton("one");
JButton b2 = new JButton("two");
JButton b3 = new JButton("three");
pane.add(b1);
pane.add(b2);
pane.add(b3);
Insets insets = pane.getInsets();
Dimension size = b1.getPreferredSize();
b1.setBounds(25 + insets.left, 5 + insets.top,
size.width, size.height);
size = b2.getPreferredSize();
b2.setBounds(55 + insets.left, 40 + insets.top,
size.width, size.height);
size = b3.getPreferredSize();
b3.setBounds(150 + insets.left, 15 + insets.top,
size.width + 50, size.height + 20);
...//在main方法中:
Insets insets = frame.getInsets();
frame.setSize(300 + insets.left + insets.right,
125 + insets.top + insets.bottom);