本教程是针对JDK 8编写的。本页面描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
有关Java SE 9及其后续版本中更新的语言特性的摘要,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能以及已删除或不建议使用的选项的信息,请参阅JDK发行说明。
在以下每个问题中,选择最适合描述布局的布局管理器。假设由布局管理器控制的容器是一个JPanel。
问题1。容器中有一个组件应尽可能占据尽可能多的空间。
![]() |
![]() |
a. BorderLayout
b. GridLayout
c. GridBagLayout
d. a 和 b
e. b 和 c
答案1:d. BorderLayout 和 GridLayout 最适合处理这种情况。尽管可以使用GridBagLayout,但它比必要复杂得多。
问题2。容器中有一行组件,应全部以相同的大小显示,填充容器的整个区域。

a. FlowLayout
b. GridLayout
c. BoxLayout
d. a 和 b
答案2:b. GridLayout 是最擅长处理这种相同大小的布局,无论是在一行、一列还是一个网格中。
问题3。容器以列的方式显示多个组件,任何额外的空间都在第一个和第二个组件之间。
![]() |
![]() |
a. FlowLayout
b. BoxLayout
c. GridLayout
d. BorderLayout
答案3:b. BoxLayout 可以以列或行的方式布局组件。您可以使用一个不可见组件来指定额外的空间。
问题4。容器可以在不同的时间显示三个完全不同的组件,这取决于用户输入或程序状态。即使组件的大小不同,从一个组件切换到另一个组件也不应改变分配给组件的空间量。


a. SpringLayout
b. BoxLayout
c. CardLayout
d. GridBagLayout
答案4: c. CardLayout 存在的目的是允许组件共享同一空间。虽然使用 JTabbedPane 组件来控制一个区域更简单,但当你不想使用选项卡时,CardLayout 是解决方案。
练习题1. 实现题目1中描述的布局并展示。
答案1: 查看 Layout1.java
。下面是实现该布局的代码:
JPanel p = new JPanel(new BorderLayout());
p.add(createComponent("组件1"),
BorderLayout.CENTER);
frame.setContentPane(p);
练习题2. 实现题目2中描述的布局并展示。
答案2: 查看 Layout2.java
。下面是实现该布局的代码:
JPanel p = new JPanel(new GridLayout(1,0));
p.add(createComponent("组件1"));
p.add(createComponent("组件2"));
p.add(createComponent("组件3"));
p.add(createComponent("组件4"));
frame.setContentPane(p);
练习题3. 实现题目3中描述的布局并展示。
答案3: 查看 Layout3.java
。下面是实现该布局的代码:
JPanel p = new JPanel();
p.setLayout(new BoxLayout(p, BoxLayout.PAGE_AXIS));
p.add(createComponent("组件1"));
p.add(Box.createVerticalGlue());
p.add(createComponent("组件2"));
p.add(createComponent("组件3"));
p.add(createComponent("组件4"));
frame.setContentPane(p);
练习题4. 实现题目4中描述的布局并展示。
答案4: 查看 Layout4.java
。下面是实现该布局的代码:
...//设置单选按钮的部分:
for (int i= 0; i < strings.length; i++) {
...
rb[i].setActionCommand(String.valueOf(i));
...
}
...//设置包含共享空间组件的面板部分:
cards = new JPanel(new CardLayout());
for (int i = 0; i < strings.length; i++) {
cards.add(createComponent(strings[i]), String.valueOf(i));
}
...//单选按钮的动作监听器部分:
public void actionPerformed(ActionEvent evt) {
CardLayout cl = (CardLayout)(cards.getLayout());
cl.show(cards, (String)evt.getActionCommand());
}
练习5。通过添加一行代码,使你在练习2中编写的程序从左到右显示组件变为从右到左显示。

答案5:你可以使用Component类定义的setComponentOrientation方法来更改水平方向的布局方向。例如:
p.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);