_awt_LayoutManager布局管理器——FlowLayout、BorderLayout、GridLayout、GridBagLayout、CardLayout、BoxLayout

1.FlowLayout

        在FlowLayout布局管理器中,组件像流水一样向某方向流动(排列),遇到障碍(边界)就折回,重头开始排列。在默认情况下,FlowLayout布局管理器从左向右排列所有组件,遇到边界就会折回下一行重新开始

构造方法方法功能
FlowLayout()使用默认的对齐方式及默认的垂直间距,水平间距创建FlowLayout布局管理器
FlowLayout(int align)使用指定的对齐方式及默认的垂直间距,水平间距创建FlowLayout布局管理器
FlowLayout(int align,int hgap,int vgap)使用指定的对齐方式及指定的垂直间距,水平间距创建FlowLayout布局管理器

FlowLayout中组件的排列方向(从左向右,从右向左,从中间向两边等),该参数应该使用FlowLayout类的静态常量:FlowLayout.LEFT、FlowLayout.CENTER、FlowLayout.RIGHT,默认是左对齐。

FlowLayout中组件中间距通过整数设置,单位是像素,默认是5个像素。

代码演示:

package com.aynu.layout;

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

public class FlowLayoutDemo {
    public static void main(String[] args) {
        Frame frame =new Frame("这里测试FlowLayout");

        //1.通过setLayout设置容器的布局管理器
//        frame.setLayout(new FlowLayout(FlowLayout.LEFT,20,20));
        frame.setLayout(new FlowLayout(FlowLayout.LEFT,40,20));
        //2.添加多个按钮到FlowLayout

        for (int i=0;i<100;i++){
            frame.add(new JButton("按钮"+i));
        }
        //3.设置最佳大小,pack方法
        frame.pack();


        frame.setVisible(true);
    }
}

 

2.BorderLayout

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

                                  

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

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

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

构造方法方法功能
BorderLayout()使用默认的水平间距,垂直间距创建BorderLayout布局管理器
BorderLayout(int hgap,int vgap);使用指定的水平间距,垂直间距创建BorderLayout布局管理器

 代码演示:

package com.aynu.layout;

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

public class BorderLayout {
    public static void main(String[] args) {

        Frame frame =new Frame("这里测试BorderLayout");

        //1.给frame设置BorderLayout布局管理器
        frame.setLayout(new java.awt.BorderLayout(60,30));
        //2.往frame指定区域添加组件
        frame.add(new JButton("北侧按钮"), java.awt.BorderLayout.NORTH);
        frame.add(new JButton("南侧按钮"), java.awt.BorderLayout.SOUTH);
        frame.add(new JButton("东侧按钮"), java.awt.BorderLayout.EAST);
        frame.add(new JButton("西侧按钮"), java.awt.BorderLayout.WEST);
        frame.add(new JButton("中侧按钮"), java.awt.BorderLayout.CENTER);




        frame.pack();
        
        frame.setVisible(true);
    }
}

 

  GridLayout:

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

构造方法方法功能
GridLayout(int rows,int cols)采用指定的行数、列数,以及默认的横向间距、纵向间距将容器分割成多个网格
GridLayout(int rows,int cols,int hgap,int vgap)采用指定的行数、列数,以及指定的横向间距,纵向间距将容器分割成多个网络
package com.aynu.layout;

import java.awt.*;
import java.awt.BorderLayout;

public class GridLayout {
    public static void main(String[] args) {
        Frame frame =new Frame("这里测试GridLayout");

        //1.创建一个Panel对象,里面存放一个TextFiled组件
        Panel p=new Panel();
        p.add(new TextField(30));
        //2.把当前这个Panel添加到frame的北边区域
        frame.add(p, BorderLayout.NORTH);
        //3.创建一个Panel对象,并且设置它的布局管理器为GridLayout
        Panel p2 = new Panel();
        p2.setLayout(new java.awt.GridLayout(3,5,4,4));

        //4.往Panel中添加内容
        for (int i = 0; i < 10; i++) {
            p2.add(new Button(i+""));
        }
        p2.add(new  Button("+"));
        p2.add(new  Button("-"));
        p2.add(new  Button("*"));
        p2.add(new  Button("/"));
        p2.add(new  Button("."));

        //把当前Panel添加到frame中
        frame.add(p2);


        frame.pack();
        frame.setVisible(true);
    }
}

 GridBagLayout:

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

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

CardLayout:

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

方法名称方法功能
CardLayout创建默认的CardLayout布局管理器
CardLayout(int hgap,int vgap)通过指定卡片与容器左右边界的间距(hgap)、上下边界(vgap)的间距来创建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.aynu.layout;

import javax.swing.*;
import java.awt.*;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class CardLayoutDemo {
    public static void main(String[] args) {

        Frame frame=new Frame("这里测试CardLayout");

        //1.创建一个Panel,用来存储多张卡片
        Panel p1=new Panel();
        //2.创建CardLayout对象,并且把该对象设置给之前创建的容器
        CardLayout cardLayout = new CardLayout();
        p1.setLayout(cardLayout);
        //3.往panel中存储多个组件
        String[] names = {"第一张","第二张","第三张","第四张","第五张"};
        for (int i = 0; i < names.length; i++) {
            p1.add(names[i],new JButton(names[i]));
        }
        //4.把panel放到frame的中间区域
        frame.add(p1);
        //5.创建另外一个panel p2,用来存储多个按钮组件
        Panel p2 = new Panel();
        //6.创建五个按钮组件
        JButton b1 = new JButton("上一张");
        JButton b2 = new JButton("下一张");
        JButton b3 = new JButton("第一张");
        JButton b4 = new JButton("最后一张");
        JButton b5 = new JButton("第三张");

        //7.创建一个事件监听器,监听按钮的点击动作
        ActionListener listener=new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String actionCommand = e.getActionCommand();  //这个字符串就是按钮上的文字
                switch (actionCommand){
                    case "上一张":
                        cardLayout.previous(p1);
                        break;
                    case "下一张":
                        cardLayout.next(p1);
                        break;
                    case "第一张":
                        cardLayout.first(p1);
                        break;
                    case "最后一张":
                        cardLayout.last(p1);
                        break;
                    case "第三张":
                        cardLayout.show(p1,"第三张");
                        break;
                }

            }
        };
        //8.把当前这个事件监听器和按钮绑定到一起
        b1.addActionListener(listener);
        b2.addActionListener(listener);
        b3.addActionListener(listener);
        b4.addActionListener(listener);
        b5.addActionListener(listener);
        //9.把按钮添加到容器p2中
        p2.add(b1);
        p2.add(b2);
        p2.add(b3);
        p2.add(b4);
        p2.add(b5);
        //把p2放到frame的南边去
        frame.add(p2, BorderLayout.SOUTH);

        frame.pack();
        frame.setVisible(true);
    }
}

 BoxLayout:

为了简化开发,Swing引入了一个新的布局管理器:BoxLayout。BoxLayout可以在垂直和水平两个方向上摆放GUI组件,BoxLayout提供了如下一个简单的构造器:

方法名称方法功能
BoxLayout(Container target,int axis)指定创建基于target容器的BoxLayout布局管理器,该布局管理器里的组件按axis方向排列。其中axis有BoxLayout.X_AXIS(横向)和BoxLayout.Y_AXIS(纵向)两个方向。
package com.aynu.layout;

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

public class BoxLayoutDemo {
    public static void main(String[] args) {
        Frame frame = new Frame("这里测试BoxLayout");


        //1.基于frame容器,创建一个BoxLayout对象,并且,该对象存放组件时垂直存放
        BoxLayout boxLayout = new BoxLayout(frame, BoxLayout.Y_AXIS);

        //2把BoxLayout对象设置给frame
        frame.setLayout(boxLayout);

        //3.往frame中添加两个按钮组件
        frame.add(new Button("按钮1"));
        frame.add(new Button("按钮2"));


        frame.pack();
        frame.setVisible(true);
    }
}

 在java.swing包中,提供了一个新的容器Box,该容器的默认布局管理器就是BoxLayout,大多数情况下,使用Box容器去容纳多个GUI组件,然后再把Box容器作为一个组件,添加到其他的容器中,从而形成整体窗口布局

方法名称方法功能
static Box createHorizontalBox()创建一个水平排列组件的Box容器
static Box createVerticalBox()创建一个垂直排列组件的Box组件
package com.aynu.layout;

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

public class BoxLayoutDemo2 {
    public static void main(String[] args) {
        Frame frame =new Frame("这里测试Boxlayout");

        //1.创建一个水平排列组件的Box容器
        Box hBox = Box.createHorizontalBox();
        //往当前容器中添加两个按钮
        hBox.add(new JButton("水平按钮1"));
        hBox.add(new JButton("水平按钮2"));

        //3.创建一个垂直排列组件的Box容器
        Box vBox = Box.createVerticalBox();
        //4.往当前容器中添加两个按钮
        vBox.add(new Button("垂直按钮1"));
        vBox.add(new Button("垂直按钮2"));
        //5.把两个Box容器添加到Frame中展示
        frame.add(hBox, BorderLayout.NORTH);
        frame.add(vBox);



        frame.pack();
        frame.setVisible(true);
    }
}

 

通过之前的两个BoxLayout演示,我们会发现,被它管理的内容中的组件是没有间隔的,不是特别的美观,但之前学习的几种布局,组件之间都会有一些间距,那使用BoxLayout如何给各组件设置间距呢?

其实很简单,我们只需要在原有的组件需要间隔的地方,添加间隔即可,而每个间隔可以是一个组件,只不过该组件没有内容,仅仅起到分割的作用。

Box类中,提供了五个方便的静态方法来生成这些间隔组件:

方法名称方法功能
static Component createHorizontalGlue()创建一条水平Glue(可在两个方向上同时拉伸的间距)
static Component createVerticalGlue()创建一条垂直Glue(可在两个方向上同时拉伸的间距)
static Component createHorizontalStrut(int width)创建一条指定宽度(宽度固定了,不能拉伸)的水平Strut(可在垂直方向上拉伸的间距)
static Component createVerticalStrut(int height)创建一条指定高度(高度固定了,不能拉伸)的水平Strut(可在水平方向上拉伸的间距)
package com.aynu.layout;

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

public class BoxLayoutDemo3 {
    public static void main(String[] args) {
        Frame frame = new Frame("这里测试BoxLayout");


        //1.创建水平排列的Box容器
        Box hBox=Box.createHorizontalBox();
        //2.往Box容器中添加按钮,还需要在多个按钮之间添加间隔
        hBox.add(new Button("水平按钮1"));
        hBox.add(Box.createHorizontalGlue());  //该分割在两个方向上都可以拉伸
        hBox.add(new Button("水平按钮2"));
        hBox.add(Box.createHorizontalStrut(30));
        hBox.add(new Button("水平按钮3"));
        //3.创建垂直排列的Box容器
        Box vBox=Box.createVerticalBox();
        //4.往Box容器中添加按钮,还需要在多个按钮之间添加间隔
        vBox.add(new Button("垂直按钮1"));
        vBox.add(Box.createVerticalGlue());   //该分割在两个方向上都可以拉伸
        vBox.add(new Button("垂直按钮2"));
        vBox.add(Box.createVerticalStrut(30));
        vBox.add(new Button("垂直按钮3"));
        //5.将Box容器添加到frame
        frame.add(hBox, BorderLayout.NORTH);
        frame.add(vBox);

        frame.pack();
        frame.setVisible(true);
    }
}

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iuiu啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值