JavaGUI - [03] LayoutManager布局管理器

  Component中有一个方法setBounds()可以设置当前容器的位置和大小,但如果我们手动为组件设置位置和大小的话,就会造成程序的不通用性。LayoutManager布局管理器可以根据运行平台来自动调整组件大小,程序员不用再手动设置组件的大小和位置,只需要为容器选择合适的布局管理器即可。

 

 

一、布局管理器的种类

LayoutManager >GridLayout:网格布局管理器

LayoutManager >FlowLayout:流式布局管理器

LayoutManager2>CardLayout:卡片布局管理器

LayoutManager >GridBagLayout:网格包布局管理器

LayoutManager >BorderLayout:边框布局管理器(默认布局)

 

 

二、FlowLayout

  在FlowLayout布局管理器中,组件像流水一样向某方向流动(排列),遇到障碍(边界)就折回,重头开始排列。通俗的讲就像是:自动换行。

FlowLayout()

使用默认的对齐方式及默认的垂直间距、水平间距创建FlowLayout布局管理器。

FlowLayout(int align)

使用指定的对齐方式及默认的垂直间距、水平间距创建FlowLayout布局管理器。

FlowLayout(int align,int hgap,int vgap)

使用指定的对齐方式指定的垂直间距、水平间距创建FlowLayout布局管理器。

 

2.1、FlowLayoutDemo

package com.harley.layout;

import javax.swing.*;
import java.awt.*;

/**
 * @author harley
 * @date 2024/05/06 12:19
 */
public class s04_FlowLayoutDemo {
    public static void main(String[] args) {

        Frame frame = new Frame("FlowLayoutDemo");
        // 1. 指定局部方式
        frame.setLayout(new FlowLayout());
        // 2. 添加组件到frame中
        for(int i = 1;i <= 100;i++){
            frame.add(new JButton("按钮"+i));
        }

        // 3. 设置最佳大小,pack方法
        frame.pack();
        // 4. 设置window可见
        frame.setVisible(true);
    }
}

效果如下

 

左对齐:frame.setLayout(new FlowLayout(FlowLayout.LEFT,20,20));

居中对齐:frame.setLayout(new FlowLayout(FlowLayout.CENTER,20,20));

右对齐:frame.setLayout(new FlowLayout(FlowLayout.RIGHT,20,20));

 

 

三、BorderLayout(默认布局)

  BorderLayout将容器分为EAST、SOUTH、WEST、NORTH、CENTER五个区域,普通组件可以被放置在这5个区域的任意一个中。BorderLayout布局管理器的布局示意图如图所示。

  当改变使用BorderLayout的容器的大小时,NORTH、SOUTH和CENTER区域水平调整,而EAST、WEST和CENTER区域垂直调整。使用BorderLayout有如下两个注意点。

1、当向使用BorderLayout布局管理器的容器中添加组件时,需要指定要添加到哪个区域中,如果没有指定添加到哪个区域中,则默认添加到中间区域中;

2、如果向同一个区域中添加多个组件时,后放入的组件会覆盖先放入的组件。

 

构造方法有如下:

BorderLayout():使用默认的水平间距、垂直间距创建BorderLayout布局管理器。

BorderLayout(int hgap,int vgap):使用指定的水平间距、垂直间距创建BorderLayout布局管理器。

 

五神兽阵法

package com.harley.layout;

import java.awt.*;

/**
 * @author harley
 * @date 2024/05/06 13:34
 */
public class s05_BorderLayoutDemo1 {
    public static void main(String[] args) {
        // 1. 创建window窗口对象
        Frame frame = new Frame("BorderLayoutDemo1");
        // 2. 设置布局管理器为BorderLayout
        frame.setLayout(new BorderLayout(30,10));
        // 3. 向frame中添加组件
        frame.add(new Button("青龙"),BorderLayout.EAST);
        frame.add(new Button("朱雀"),BorderLayout.SOUTH);
        frame.add(new Button("白虎"),BorderLayout.WEST);
        frame.add(new Button("玄武"),BorderLayout.NORTH);
        frame.add(new Button("麒麟"),BorderLayout.CENTER);
        
        // 4. 设置自动大小
        frame.pack();
        // 5. 设置窗口可见
        frame.setVisible(true);

    }
}

效果如下

如果西侧/东侧不放置组件,则会被中间组件占用掉。

如果西侧和东侧都不放置,则中间组件独占。

如果北侧/南侧不放置组件,则会被东侧、西侧以及中间的组件占用掉。

如果北侧和南侧都不放置,则会被东侧、西侧以及中间的组件占用掉。

如果中间不放置组件,中间区域并不会被占用。

 

四、GridLayout

  GridLayout布局管理器将容器分割成纵横线分割的网格,每个网格所占的区域大小相同。当向使用GridLayout布局管理器的容器中添加组件时,默认从左向右、从上向下依次添加每个网格中。与FlowLayout不同的是,放置在GridLayout布局管理器中的各个组件的大小由组件所处的区域决定(每个组件将自动占满整个区域)。

GridLayout(int rows,int cols)

采用指定的行数、列数,以及默认的横向间距、纵向间距将容器分割成多个网格。

GridLayout(int rows,int cols,int hgap,int vgap)

采用指定的行数、列数,以及指定的横向间距、纵向间距将容器分割成多个网格。

 

计算器

效果

代码

package com.harley.layout;

import java.awt.*;

/**
 * @author harley
 * @date 2024/05/06 13:56
 */
public class s06_GridLayoutDemo {
    public static void main(String[] args) {
        // 1. 创建window窗口对象
        Frame frame = new Frame("FlowLayoutDemo");
        // 2. 创建Panel对象,存放一个TextField组件
        Panel panel = new Panel();
        panel.add(new TextField(30));
        // 3. 把Panel放到frame的北边区域,默认是BorderLayout布局
        frame.add(panel,BorderLayout.NORTH);
        // 4. 创建一个Panel2对象,并且设置它的布局管理器为GridLayout
        Panel panel2 = new Panel();
        panel2.setLayout(new GridLayout(3,5,4,4));
        // 5. 向Panel2中添加内容
        for (int i = 0; i < 10; i++) {
            panel2.add(new Button(i+""));
        }
        panel2.add(new Button("+"));
        panel2.add(new Button("-"));
        panel2.add(new Button("*"));
        panel2.add(new Button("/"));
        panel2.add(new Button("."));
        
        // 6. 把panel2添加到frame中
        frame.add(panel2);
        // 7. 设置最佳大小,pack方法
        frame.pack();
        // 8. 设置window可见
        frame.setVisible(true);
    }
}

 

 

五、GridBagLayout

  GridBagLayout布局管理器的功能最强大,但也最复杂,与GridLayout布局管理器不同的是,在GridBagLayout布局管理器中,一个组件可以跨越一个或多个网格,并可以设置各网格的大小互不相同,从而增加了布局的灵活性。当窗口的大小发生变化时,GridBagLayout布局管理器也可以准确地控制窗口各部分的拉伸。

  由于在GridBagLayout布局中,每个组件可以占用多个网格,此时,我们往容器中添加组件的时候,就需要具体的控制每个组件占用多少个网格,java提供的GridBagConstaints类,与特定的组件绑定,可以完成具体大小和跨越性的设置。

代码略

 

六、CardLayout

  CardLayout布局管理器以时间而非空间来管理它里面的组件,它将加入容器的所有组件看成一叠卡片(每个卡片其实就是一个组件),每次只有最上面的那个Component才可见。就好像一副扑克牌,它们叠在一起,每次只有最上面的一张扑克牌才可见。

CardLayout():创建默认的CardLayout布局管理器

CardLayout(int hgap,int vgap)

通过指定卡片与容器左右边界的间距(C hgap)、上下边界(Cvgap)的间距来创建CardLayout布局管理器

first(Container target):显示target容器中的第一张卡片

last(Container target):显示target容器中的最后一张卡片

previous(Container target):显示target容器中的前一张卡片

next(Container target):显示target容器中的后一张卡片

show(Container target,String name):显示target容器中指定名字的卡片

 

效果

代码

package com.harley.layout;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * @author harley
 * @date 2024/05/06 14:33
 */
public class s08_CardLayoutDemo {
    public static void main(String[] args) {
        // 1. 创建window窗口对象
        Frame frame = new Frame("CardLayoutDemo");
        // 2. 创建一个Panel用来存储多张卡片
        final Panel panel = new Panel();
        // 3. 创建CardLayout对象,并且把该对象设置给之前创建容器panel
        final CardLayout cardLayout = new CardLayout();
        panel.setLayout(cardLayout);
        // 4. 向Panel中存储多个组件
        String[] names = {"第一张","第二张","第三张","第四张","第五张","第六张"};
        for (int i = 0; i < names.length; i++) {
            panel.add(names[i],new Button(names[i]));
        }
        // 5. 将panel放入frame的中间区域
        frame.add(panel,BorderLayout.CENTER);
        // 6. 创建另外一个Panel,存储多个按钮组件
        final Panel panel2 = new Panel();
        // 7. 创建5个按钮组件
        Button button1 = new Button("上一张");
        Button button2 = new Button("下一张");
        Button button3 = new Button("第一张");
        Button button4 = new Button("最后一张");
        Button button5 = new Button("第三张");
        // 8. 创建一个事件监听器,监听按钮的点击动作
        ActionListener listener = new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                String actionCommand = e.getActionCommand();
                switch (actionCommand){
                    case "上一张":
                        cardLayout.previous(panel);
                        break;
                    case "下一张":
                        cardLayout.next(panel);
                        break;
                    case "第一张":
                        cardLayout.first(panel);
                        break;
                    case "最后一张":
                        cardLayout.last(panel);
                        break;
                    case "第三张":
                        cardLayout.show(panel,"第三张");
                        break;
                    default:
                        cardLayout.first(panel);
                        break;

                }
            }
        };
        // 9. 把当前这个事件监听器和多个按钮绑定到一起
        button1.addActionListener(listener);
        button2.addActionListener(listener);
        button3.addActionListener(listener);
        button4.addActionListener(listener);
        button5.addActionListener(listener);
        // 10. 把按钮添加到panel中
        panel2.add(button1);
        panel2.add(button2);
        panel2.add(button3);
        panel2.add(button4);
        panel2.add(button5);
        // 11. 将panel2添加到frame的南侧
        frame.add(panel2,BorderLayout.SOUTH);
        // 12. 设置自动大小
        frame.pack();
        // 13. 设置窗口可见
        frame.setVisible(true);

    }
}

 

 

 

— 要养成终身学习的习惯 —

posted @ 2024-05-06 12:15  HOUHUILIN  阅读(81)  评论(0编辑  收藏  举报