技术开发 频道

Java布局管理器能改进GUI设计和开发过程

   可内置一个子控件的控件(如窗口)是 java.awt.Container 的一个子类。每一个容器有一个布局管理器,每一个布局管理器负责为容器定位控件。最简单的布局控件 FlowLayout 以从左到右的方式对控件布局。

  清单 2 中是这种布局管理器的代码,其中 frame 的布局设置为 FlowLayout 的一个实例,而且那两个按钮被添加到 frame。请注意,设置两个按钮界限来定位和调整它们大小的几行被删除了。当使用布局管理器时,控件不再是通过设置界限来个别地定位。计算它所有子控件的位置和大小是通过布局管理器完成的。

  清单 2. 使用流程布局管理器的简单 GUI

1 Frame frame = new Frame();
2 frame.setLayout(new FlowLayout());
3 frame.setBounds(100,100,160,70);
4 Button button1 = new Button("Suivante");
5 frame.add(button1);
6 Button button2 = new Button("Precedente");
7 frame.add(button2);
8 frame.setVisible(true);
9

  如图 3 所示,流程布局管理器将两个按钮定位在可用空间的中间。每个按钮的标签被分配了足够的空间,在两边留下刚好适量的空格。

  图 3. FlowLayout 从左到右对控件进行布局

       

  清单 2 不包含设置按钮大小的代码,这可能让您想知道流程布局管理器是怎样判断每个按钮的适当宽度的。这是通过 Component 类的 getPreferredSize() 方法完成的。首选大小是包含宽度和高度的 Dimension 的一个实例。 Button 类被编写成检查其标签和其字体的规格并计算显示整个标签所需的宽度。如果标签变长,首选大小也会改变,布局管理器就会使用新的首选大小。图 4 说明的是一个从英语翻译到法语的 GUI,按钮的大小被增加以适应新的字符串。

  图 4. FlowLayout 调整按钮的首选大小

       

  在查询每个控件的首选大小之后,布局管理器根据可用空间设置每个控件的位置。控件的定位让它们不会互相重叠。当窗口变大时, FlowLayout 在可用空间的中心重新定位控件。如果没有足够的空间并排放置控件,布局管理器会将其上下排列,如图 5 所示。

  图 5. FlowLayout 将控件上下排列

       

  动态调整 GUI 窗口大小

  在上面的 清单 1 和清单 2 中,窗口的实际大小被硬编码成宽度为 160,高度为 70。这会出问题,因为控件本身的大小和位置会根据其中包含的文本而增大或缩小。如果控件对窗口来说变得太大,就会被截断;如果它变得太小,周围的就会有多余空间。图 6 展示了这样的结果,其中字符串对于窗口来说变得太大了。

  图 6. 使用静态窗口大小的结果

       

  Window 组件提供 pack() 方法来解决这个问题。当向窗口发送 pack() 时,窗口会调整自身大小,从而提供足够的空间来显示其框架中包含的所有控件。清单 3 展示了写入了 pack() 方法的简单的 GUI。

  清单 3. 使用 pack() 方法的简单的 GUI

1 Frame frame = new Frame();
2 frame.setLayout(new FlowLayout());
3 Button button1 = new Button("Advance Forward");
4 frame.add(button1);
5 Button button2 = new Button(" Revert to Previous");
6 frame.add(button2);
7 frame.pack();
8 frame.setVisible(true);
9

  当使用了 pack() 后, Window 会调整自身大小,让控件不会被剪切。

  使用方法计算首选大小

  从上面的示例应该可以看出,设计 GUI 屏幕时,总是指定固定的大小是危险的。此外,控件的位置不应该以 x 和 y 或宽度和高度的形式表示。每个控件包含动态计算首选大小的方法,应该使用这些方法来给您的 GUI 带来最大的流动性。表 1 展示了计算控件大小的方法的一些示例。

  表 1. 计算控件大小的方法

控件描述方法
按钮显示当前标签文本setLabel(String)或 setText(String)
文本显示很多字符setColumns(int)
标签显示标签的文本setLabel(String)或 setText(String)
文本域显示很多字符的行和列setRows(int)和 setColumns(int)
列表显示很多行根据添加的行数计算

  清单 4 展示了以上每个简单的 GUI 的方法的构造。

  清单 4. 使用计算控件首选大小方法的简单的 GUI

1 Frame frame = new Frame();
2 frame.setLayout(new FlowLayout());
3 Button button1 = new Button("Next");
4 frame.add(button1);
5 TextField text1 = new TextField();
6 text1.setColumns(10);
7 frame.add(text1);
8 Label label1 = new Label("First Name:");
9 frame.add(label1);
10 TextArea textArea1 = new TextArea("This is some text in a text area");
11 textArea1.setRows(2);
12 textArea1.setColumns(10);
13 frame.add(textArea1);
14 List list1 = new List();
15 list1.add("FirstItem");
16 list1.add("SecondItem");
17 list1.add("ThirdItem");
18 list1.add("FourthItem");
19 list1.add("FifthItem");
20 frame.add(list1);
21 frame.pack();
22 frame.setVisible(true);
23

  图 7 展示了以上方法对我们的 GUI 的影响

  图 7. 使用首选大小方法的结果

       

0
相关文章