图形界面布局管理器

2.图形界面布局管理器

在容器中加入界面组件,构成要呈现的图形界面时,容器需要设定布局管理方式,就像是房间里放多个家具时,需要布局好每件家具应该放在什么位置,还需要设定当窗口改变大小时,组件的大小和位置该如何做出相应的改变。

Java定义了几种布局管理器,每种布局管理器对应一种布局策略。java.awt包中有流式布局管理器Flow Layout、边界布局管理器Border Layout、卡片式布局管理器Card Layout、网格式布局管理器Grid Layout、网格包布局管理器GridBag Layout等。java.swing包中有盒式布局管理器Box Layout、重叠布局管理器Overlay Layout、弹簧布局管理器Spring Layout等。

每种容器都有默认的布局管理器,如果不改变容器的布局管理器,加入的组件将以默认的布局管理方式去放置。例如,JFrame的默认布局管理器是Border Layout,JPanel的默认布局管理器是Flow Layout。也可以设置新的布局管理器,不选择默认布局管理器。

(1)绝对布局

绝对布局就是设置容器的布局管理器为null,加入的所有组件都要设置好大小和放置的位置坐标,按照设置的大小和坐标去呈现和放置。

采用绝对布局时,如果容器大小是可变的,当容器的大小形状发生改变的时候或者显示器配置变化的时候,以绝对坐标和绝对大小放置在容器中的组件有可能呈现得不恰当,如代码8.1的运行结果。所以,一般在采用绝对布局方式时,要将窗口设定为不可改变大小。

【代码8.1】绝对布局案例

代码8.1的运行效果如图2.8.2所示。

图2.8.2 代码8.1的运行效果

当拖动窗口改变窗口大小形状的时候,可能出现不适当的情况,当缩小窗口大小的时候,可能出现图2.8.3所示的效果。

图2.8.3 代码8.1运行时可能出现的不适当情况

(2)边界布局

容器JFrame默认的布局管理器是边界布局管理器(Border Layout),边界布局管理器的布局策略是将容器分为东西南北中5个部分(如图2.8.4所示),加入组件时要指出加入在哪个区域,如果不指出加入区域,默认加入中间区域Border Layout.CENTER。如果东西南北这4个区域中的某个区域没有加组件,就会并入中间区域。每个区域加入的组件会充满所在区域。如果在一个区域加入多个组件,后加入的组件会覆盖之前加入的组件。边界布局的效果如图2.8.4所示。

图2.8.4 边界布局的效果

【代码8.2】边界布局案例

代码8.2的运行效果如图2.8.5所示。

图2.8.5 代码8.2的运行效果

(3)流式布局

面板容器JPanel的默认布局管理器是流式布局管理器Flow Layout。流式布局管理器的布局策略是,组件按照加入的先后顺序设置的对齐方式,默认从左向右排列,在一行排满后遇到边界时,就折回并从下一行开始继续排列。流式布局的效果如图2.8.6所示。

图2.8.6 流式布局的效果

【代码8.3】流式布局案例

代码8.3的运行效果如图2.8.7所示。

图2.8.7 代码8.3的运行效果

(4)网格式布局

网格式布局管理器Grid Layout也是一种常用的布局管理器。当创建网格式布局管理器对象时,要设定行数和列数。容器将按照行数和列数形成纵横线网格布局,组件放入容器的次序决定了它在容器中的位置,组件对象逐行从左到右加入。每个加入的组件将占满所在的区域。

【代码8.4】网格布局案例

代码8.4的运行效果如图2.8.8所示。

图2.8.8 代码8.4的运行效果

(5)嵌套布局

可以将一个容器分成不同的区域,不同的区域采用不同的布局方式。实现方法是在不同的区域中加入JPanel(面板)对象,将每个区域的面板设置为不同的布局管理器,这样不同区域加入的组件就会有不同的布局了。JPanel容器在这种情况下是用来分区的。JPanel容器可以称作是中层容器,必须放入其他容器中,不能作为顶层容器独立呈现。

【代码8.5】嵌套布局案例

代码8.5的运行效果如图2.8.9所示。

图2.8.9 代码8.5的运行效果