图形化用户界面(3):控制布局

短命女 2023-03-04 10:26 177阅读 0赞
  1. java中,组件放置在窗体上的方式可能与你使用过的任何GUI系统都不相同。首先,它完全基于代码;没有用来控制组件布置的“资源”。第二,组件放置在窗体上的方式不是通过绝对坐标控制,而是由“布局管理器”根据组件加入的顺序决定其位置。使用不同的布局管理器,组件的大小、形状和位置将大不相同。此外,布局管理器还可以适应applet或应用程序窗口的大小,所以如果窗口的尺寸改变了,组件的大小、形状和位置也能够做相应的改变。
  2. JAppletJFrameJDialogJPanel等都可以包含和显示组件。Container中有一个称为setLayout()的方法,可以通过这个方法来选择不同的布局管理器。在本节中,我们将通过在窗体上放置一些按钮来研究不同的布局管理器(这样最简单)。这些示例不会捕获任何按钮事件,因为它们仅仅是为了演示按钮是如何布局的。

一、BorderLayout

  1. 除非你设置为其他的布局模式,否则JFrame将使用BorderLayout作为默认的布局模式。如果不加入其他指令,它将接受你调用add()方法而加入的组件,把它放置在中央,然后把组件向各个方向拉伸,直到与边框对齐。
  2. BorderLayout具有四个边框区域和一个中央区域的概念。当向由BorderLayout管理的面板加入组件的时候,可以使用重载的add()方法,它的第一个参数接受一个常量值。这个值可以为一下任何一个:























BorderLayout.NORTH 顶端
BorderLayout.SOUTH 底端
BorderLayout.EAST 右端
BorderLayout.WEST 左端
BorderLayout.CENTER 从中央开始填充,直到与其他组件或边框相遇
  1. 如果没有为组件指定放置位置,默认情况下它将被放置到中央。
  2. 在下面的示例中使用了默认布局,因为默认情况下JFrame使用的就是BorderLayout
  3. package gui;
  4. import java.awt.BorderLayout;
  5. import javax.swing.JButton;
  6. import javax.swing.JFrame;
  7. import com.buba.util.SwingConsole;
  8. public class BorderLayout1 extends JFrame {
  9. public BorderLayout1() {
  10. add(BorderLayout.NORTH, new JButton("NORTH"));
  11. add(BorderLayout.SOUTH, new JButton("SOUTH"));
  12. add(BorderLayout.EAST, new JButton("EAST"));
  13. add(BorderLayout.WEST, new JButton("WEST"));
  14. add(BorderLayout.CENTER, new JButton("CENTER"));
  15. }
  16. public static void main(String[] args) {
  17. SwingConsole.run(new BorderLayout1(), 300, 200);
  18. }
  19. }

20200803144917754.png

  1. 对于除CENTER以外的所有位置,加入的组件将被沿着一个方向压缩到最小尺寸,同时在另一个方向拉伸到最大尺寸。不过对于CENTER,组件将在两个方向上同时拉伸,以覆盖中央区域。

二、FlowLayout

  1. 它直接将组件从左到右“流动”到窗体上,直到占满上方的空间,然后向下移动一行,继续流动。
  2. 在下面的例子中,先把布局管理器设置为Flowlayout,然后在窗体上放置按钮。你将注意到,在使用FlowLayout的情况下,组件将呈现出“合适”的大小。比如,一个JButton的大小就是其标签的大小。
  3. package gui;
  4. import java.awt.FlowLayout;
  5. import javax.swing.JButton;
  6. import javax.swing.JFrame;
  7. import com.buba.util.SwingConsole;
  8. public class FlowLayout1 extends JFrame {
  9. public FlowLayout1() {
  10. setLayout(new FlowLayout());
  11. for (int i = 0; i < 20; i++) {
  12. add(new JButton("Button " + i));
  13. }
  14. }
  15. public static void main(String[] args) {
  16. SwingConsole.run(new FlowLayout1(), 300, 300);
  17. }
  18. }

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwMjk4MzUx_size_16_color_FFFFFF_t_70

  1. 使用FlowLayout,所有的组件将被压缩到它们的最小尺寸,所以可能会得到令人惊讶的效果。比如,在使用FlowLayout的时候,因为JLabel的尺寸就是其字符串的尺寸,这就使得文本右对齐不会产生任何视觉上的效果。
  2. 请注意:如果你调整视窗的尺寸。那么布局管理器将随之重新流动所有组件。

三、GridLayout

  1. GridLayout允许你构建一个放置组件的表格,在向表格里面添加组件的时候,它们将按照从左到右,从上到下的顺序加入。在构造器中要指定需要的行数和列数,它们将均匀分布在窗体上。
  2. package gui;
  3. import java.awt.GridLayout;
  4. import javax.swing.JButton;
  5. import javax.swing.JFrame;
  6. import com.buba.util.SwingConsole;
  7. public class GridLayout1 extends JFrame {
  8. public GridLayout1() {
  9. setLayout(new GridLayout(7, 3));
  10. for (int i = 0; i < 20; i++) {
  11. add(new JButton("Button " + i));
  12. }
  13. }
  14. public static void main(String[] args) {
  15. SwingConsole.run(new GridLayout1(), 300, 300);
  16. }
  17. }

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwMjk4MzUx_size_16_color_FFFFFF_t_70 1

  1. 在这个例子中有21个空位,但是只加入了20个按钮。因为GridLayout并不进行“均衡”处理,所以最后一个空位将被闲置。

四、GridBagLayout

  1. GridBagLayout提供了强大的控制功能,包括精确判断视窗区域如何布局,以及视窗大小变化的时候如何重新放置组件。不过,它也是最复杂的布局管理器,所以很难理解。它的目的主要是辅助GUI构造工具(它可能使用GridBagLayout而不是绝对位置来控制布局)自动生成代码。如果你发现自己的设计非常复杂,以至于需要使用GridBagLayout,那么你应该使用GUI构造工具来生成这个设计。如果你觉得自己必须掌握它的复杂细节,请参考专门的Swing书作为起点。
  2. 作为一种可替换的选择,你可能会考虑TableLayout,它不属于Swing类库,但是可以从java.sun.com处下载。这个组件被置于GridBagLayout之上,并且隐藏了其大多数细节,因此可以极大地简化使用这种模式的方式。

五、绝对定位

  1. 我们也可以设置图形组件的绝对位置:
  1. 使用setLayout(null)方法把容器布局管理器设置为空。
  2. 为每个组件调用setBounds()或者reshape()方法(取决于语言的版本),为方法传递以像素坐标为单位的边界矩形的参数。根据你要达到的目的,可以在构造器或者paint()方法中调用这些方法。

    某些GUI构造工具大量使用了这种方法,不过这通常不是生成代码的最佳方式。

六、BoxLayout

  1. 由于人们在理解和使用GridBagLayout的时候遇到了很多问题,所以Swing还提供了BoxLayout,它具有GridBagLayout的许多好处,却不像GridBagLayout那么复杂。所以当你需要手工编写布局代码的时候,可以考虑使用它(再次提醒,如果你的设计过于复杂,那么就应该使用GUI构造工具来生成布局代码)。BoxLayout使你可以在水平方向或垂直方向控制组件的位置,并且通过所谓的“支架和胶水”(struts and glue)的机制来控制组件的间隔。

七、最好的方式是什么

  1. Swing功能强大;用少数几行代码就可以做很多事情。基于学习的目的,本章的例子相当简单,所以手工编写它们很有意义。通过组合简单布局,就能得到非常多的结果。不过,在某些情况下,手工编写GUI窗体就不太适合了;这样做太复杂,也不能充分利用编程时间。javaSwing设计者的最初的目的就是要使语言和库能对GUI构造工具提供支持,创建这些工具的明确的目的也是为了使你更容易得获取编程经验。只要理解了布局的方式以及如何处理事件(下面将学习到),那么如何手工放置组件的细节就显得不那么重要了;应该让合适的工具帮你去做这些事情(毕竟,设计java的目的是为了提高程序员的生产率)。

如果本文对您有很大的帮助,还请点赞关注一下。

发表评论

表情:
评论列表 (有 0 条评论,177人围观)

还没有评论,来说两句吧...

相关阅读