布局就是各个组件在窗口中的位置,或为相对位置或为绝对位置。在界面编程中是必要的。
1、简介
把 Swing
的各种组件(JComponent
)添加到面板容器中(JPanel
),需要给面板容器指定布局管理器(LayoutManager
),明确容器(Container
)内的各个组件之间的排列布局方式。
2、箱式布局
由BoxLayout类实现的布局管理器称为箱式布局管理器,用来管理一组水平或垂直排列的组件,如果是用来管理一组水平排列的组件,则称为水平箱,效果如左图所示,如果是用来管理一组垂直排列的组件,则称为垂直箱,效果如右图所示
Swing 提供了一个实现了 BoxLayout 的容器组件Box
。使用 Box 提供的静态方法,可快速创建水平/垂直箱容器(Box),以及填充组件之间空隙的不可见组件。
// 创建一个水平箱容器
Box hBox = Box.createHorizontalBox();
// 创建一个垂直箱容器
Box vBox = Box.createVerticalBox();
Box 内的组件之间默认没有空隙并居中,如果想在组件之间(或头部/尾部)添加空隙,可以在其中添加一个影响布局的不可见组件。
topicBox.add(Box.createHorizontalStrut(5));// 添加一个5像素宽的水平支柱
box.add(Box.createVerticalStrut(5));// 添加一个5像素高的垂直支柱
contentBox.setAlignmentX(1);// 设置组件的水平调整值,靠右侧对齐
contentLabel.setAlignmentY(0);// 设置组件的垂直调整值,靠上方对齐
例如将一根按钮添加到箱式容器里面:
JButton submitButton = new JButton("确定");// 创建一个按钮
submitButton.setAlignmentX(1);// 设置组件的水平调整值,靠右侧对齐
box.add(submitButton);// 添加到垂直箱容器中
3、卡片布局管理器
由CardLayout类实现的布局管理器称为卡片布局管理器,用来操纵其所管理容器中包含的容器或组件。每个直接添加到其所管理容器中的容器或组件为一个卡片,最先被添加到其所管理容器中的容器或组件被认为是第一个卡片,最后被添加的则为最后一个卡片,初次运行时将显示第一个卡片。
创建一个卡片布局管理器:
cardLayout = new CardLayout();// 创建一个卡片布局管理器对象
cardPanel = new JPanel(cardLayout);// 创建一个采用片布局管理器的面板对象
getContentPane().add(cardPanel, BorderLayout.CENTER);// 添加到窗体中间卡片中添加组件
JButton btn01 = new JButton("Button01");
panel.add(btn01, "btn01"); //btn01为一个组件,"btn01"为卡片的名字
常用的方法:
// 显示第一张卡片 void first(Container parent);
// 显示最后一张卡片 void last(Container parent);
// 显示下一张卡片(自动循环显示) void next(Container parent);
// 显示上一张卡片(自动循环显示) void previous(Container parent);
// 显示指定名称的组件(添加组件到容器时,可同时添加组件的名称) void show(Container parent, String name);
4、网格组布局管理器
由GridBagLayout类实现的布局管理器称为网格组布局管理器,它实现了一个动态的矩形网格,这个矩形网格由无数个矩形单元格组成,每个组件可以占用一个或多个这样的单元格。所谓动态的矩形网格,就是可以根据实际需要随意增减矩形网格的行数和列数。
设置为网格布局
getContentPane().setLayout(new GridBagLayout());
添加一个组件到一个网格里面,这里例如一个按钮
final JButton button = new JButton("A");
final GridBagConstraints gridBagConstraints = new GridBagConstraints(); //布局管理器
gridBagConstraints.gridy = 0;// 起始点为第1行
gridBagConstraints.gridx = 0;// 起始点为第1列
gridBagConstraints.weightx = 10;// 第一列的分布方式为10%
gridBagConstraints.fill = GridBagConstraints.HORIZONTAL;//组件 在其 显示区域内 的填充方式
getContentPane().add(button, gridBagConstraints);
5、弹簧布局管理器
弹簧布局管理器以容器和组件的边缘为操纵对象,通过为组件和容器边缘以及组件和组件边缘建立约束,实现对组件布局的管理,如下图所示
// 创建弹簧布局管理器对象
SpringLayout springLayout = new SpringLayout();
Container contentPane = getContentPane();// 获得窗体容器对象
// 将窗体容器修改为采用弹簧布局管理器
contentPane.setLayout(springLayout);设置弹簧的距离
JLabel topicLabel = new JLabel("主题:");
contentPane.add(topicLabel);
// 主题标签北侧——>容器北侧
springLayout.putConstraint(NORTH, topicLabel, 15, NORTH, contentPane);
// 主题标签西侧——>容器西侧
springLayout.putConstraint(WEST, topicLabel, 5, WEST, contentPane);
支柱和弹簧:
Spring vST = Spring.constant(20);// 创建一个支柱
Spring hSP = Spring.constant(20, 100, 500);// 创建一个弹簧
JButton lButton = new JButton("按钮L");
getContentPane().add(lButton);
springLayout.putConstraint(NORTH, lButton, vST, NORTH,getContentPane());// “按钮L”北侧——>容器北侧
springLayout.putConstraint(WEST, lButton, hSP, WEST,getContentPane());// “按钮L”西侧——>容器西侧
利用弹簧控制组件大小:
JButton lButton = new JButton("按钮L");
getContentPane().add(lButton); Spring widthSP = Spring.constant(60, 300, 600);// 创建一个弹簧
Spring heightST = Spring.constant(60);// 创建一个支柱
// 获得“按钮L”的Constraints对象
Constraints lButtonCons = springLayout.getConstraints(lButton);
lButtonCons.setWidth(widthSP);// 设置控制组件宽度的弹簧
lButtonCons.setHeight(heightST);// 设置控制组件高度的支柱