文档

Java™ 教程
教程: 使用Swing创建GUI
首页 > 使用Swing创建GUI

答案:在容器内布局组件

问题

在以下每个问题中,选择最适合描述布局的布局管理器。假设由布局管理器控制的容器是一个JPanel

问题1。容器中有一个组件应尽可能占据尽可能多的空间。

Layout1-1.png Layout1-2.png

a. BorderLayout
b. GridLayout
c. GridBagLayout
d. a 和 b
e. b 和 c

答案1:d. BorderLayoutGridLayout 最适合处理这种情况。尽管可以使用GridBagLayout,但它比必要复杂得多。


问题2。容器中有一行组件,应全部以相同的大小显示,填充容器的整个区域。

Layout2-1.png Layout2-2.png

a. FlowLayout
b. GridLayout
c. BoxLayout
d. a 和 b

答案2:b. GridLayout 是最擅长处理这种相同大小的布局,无论是在一行、一列还是一个网格中。


问题3。容器以列的方式显示多个组件,任何额外的空间都在第一个和第二个组件之间。

Layout3-1.png Layout3-2.png

a. FlowLayout
b. BoxLayout
c. GridLayout
d. BorderLayout

答案3:b. BoxLayout 可以以列或行的方式布局组件。您可以使用一个不可见组件来指定额外的空间。


问题4。容器可以在不同的时间显示三个完全不同的组件,这取决于用户输入或程序状态。即使组件的大小不同,从一个组件切换到另一个组件也不应改变分配给组件的空间量。

Layout4-1.png

Layout4-2.png

a. SpringLayout
b. BoxLayout
c. CardLayout
d. GridBagLayout

答案4: c. CardLayout 存在的目的是允许组件共享同一空间。虽然使用 JTabbedPane 组件来控制一个区域更简单,但当你不想使用选项卡时,CardLayout 是解决方案。

练习题

练习题1. 实现题目1中描述的布局并展示。
答案1: 查看 Layout1.java(在一个 .java 源文件中)。下面是实现该布局的代码:

JPanel p = new JPanel(new BorderLayout());
p.add(createComponent("组件1"),
                      BorderLayout.CENTER);
frame.setContentPane(p);


练习题2. 实现题目2中描述的布局并展示。
答案2: 查看 Layout2.java(在一个 .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(在一个 .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(在一个 .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中编写的程序从左到右显示组件变为从右到左显示。

Layout2-3.png

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

p.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);

上一页: 问题和练习:在容器中布局组件