布局就是各个组件在窗口中的位置,或为相对位置或为绝对位置。在界面编程中是必要的。

1、简介

    把 Swing 的各种组件(JComponent)添加到面板容器中(JPanel),需要给面板容器指定布局管理器(LayoutManager),明确容器(Container)内的各个组件之间的排列布局方式。

2、箱式布局

     由BoxLayout类实现的布局管理器称为箱式布局管理器,用来管理一组水平或垂直排列的组件,如果是用来管理一组水平排列的组件,则称为水平箱,效果如左图所示,如果是用来管理一组垂直排列的组件,则称为垂直箱,效果如右图所示

JAVA布局管理器 java布局管理器代码_spring

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、弹簧布局管理器

     弹簧布局管理器以容器和组件的边缘为操纵对象,通过为组件和容器边缘以及组件和组件边缘建立约束,实现对组件布局的管理,如下图所示

JAVA布局管理器 java布局管理器代码_Layout_02


 

    

// 创建弹簧布局管理器对象
         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);// 设置控制组件高度的支柱