- 面板
- 流布局管理器
- 网格布局管理器
- 边界布局管理器
今天我们先创建一个窗体,再创建一个容器,容器使用的是一个3行1列的网格布局管理器,然后我们在容器中添加不同布局的面板来看一下效果
1、首先我们来填充容器的第一行,我们创建一个流布局去填充

package cm.test.demo9;

import java.awt.*;

import javax.swing.*;

public class JPanelTest extends JFrame {
    public JPanelTest() {
        Container c=getContentPane();//创建一个窗体必备的玩意——容器
        c.setLayout(new GridLayout(3, 1));//把整个容器设置成3行1列的网格布局
        JPanel p1=new JPanel(new FlowLayout());//创建第一个面板,并让他使用流布局管理器
        String btn[]=new String[10];
        for(int i=0;i<btn.length;i++) {
            p1.add(new JButton("我是按钮"+(i+1)+"号"));//为每一个按钮赋名字,并且生成JButton对象,然后添加到面板p1中
        }
        c.add(p1);//把面板p1添加到容器中
        setBounds(100, 100, 300, 300);
        setVisible(true);
    }
    public static void main(String[] args) {
        new JPanelTest();
    }
}

输出结果:

我们改变窗体大小,按钮的布局也会跟着变化,如图

在上面的例子中,我们是在一个窗体中创建了一个面板,这个面板使用流布局管理器,我们的容器使用的是3行1列的网格布局(注意是这个面板使用流布局管理器,而不是容器使用流布局管理器,当你改成容器使用流布局管理器的话,我们这个具体每个面板内的内容就不是流布局,我们必须还得再把面板设置成流布局)

2、接下来我们再来填充容器的第二行,我们创建一个3行2列的网格布局去填充

package cm.test.demo9;

import java.awt.*;

import javax.swing.*;

public class JPanelTest extends JFrame {
    public JPanelTest() {
        Container c=getContentPane();//创建一个窗体必备的玩意——容器
        c.setLayout(new GridLayout(3, 1));//把整个容器设置成3行1列的网格布局
        JPanel p1=new JPanel(new FlowLayout());//创建第一个面板,并让他使用流布局管理器
        String btn[]=new String[10];
        for(int i=0;i<btn.length;i++) {
            p1.add(new JButton("我是按钮"+(i+1)+"号"));//为每一个按钮赋名字,并且生成JButton对象,然后添加到面板p1中
        }
        c.add(p1);//把面板p1添加到容器中

        JPanel p2=new JPanel(new GridLayout(3, 2));//创建第二个面板,并且让他使用一个网格布局管理器,网格大小为3行2列
        String btn2[]=new String[10];
        for(int i=0;i<btn2.length;i++) {
            p2.add(new JButton("我是按钮"+(i+1)+"号"));
        }
        c.add(p2);//把面板p2添加到容器中
        setBounds(100, 100, 300, 300);
        setVisible(true);
    }
    public static void main(String[] args) {
        new JPanelTest();
    }
}

输出结果:

因为我们面板1(最上面的)是使用的流布局管理器,所以他的整体布局会随着窗体的大小变化而变化,而我们的面板2(中间的)是使用的网格布局管理器,所以它整体的布局不会随着窗体的大小变化而变化。每一个网格的位置都一定固定了。

3、接下来我们再来填充容器的第三行,我们创建一个边界布局去填充

package cm.test.demo9;

import java.awt.*;

import javax.swing.*;

public class JPanelTest extends JFrame {
    public JPanelTest() {
        Container c=getContentPane();//创建一个窗体必备的玩意——容器
        c.setLayout(new GridLayout(3, 1));//把整个容器设置成2行1列的网格布局
        //创建第一个面板,并让其使用流布局管理器
        JPanel p1=new JPanel(new FlowLayout());//创建第一个面板,并让他使用流布局管理器
        String btn[]=new String[10];
        for(int i=0;i<btn.length;i++) {
            p1.add(new JButton("我是按钮"+(i+1)+"号"));//为每一个按钮赋名字,并且生成JButton对象,然后添加到面板p1中
        }
        c.add(p1);//把面板p1添加到容器中

        //创建第二个面板,并让其使用网格布局管理器
        JPanel p2=new JPanel(new GridLayout(3, 2));//创建第二个面板,并且让他使用一个网格布局管理器,网格大小为3行2列
        String btn2[]=new String[10];
        for(int i=0;i<btn2.length;i++) {
            p2.add(new JButton("我是按钮"+(i+1)+"号"));
        }
        c.add(p2);//把面板p2添加到容器中

        //创建第三个面板,并让其使用边界布局管理器
        JPanel p3=new JPanel(new BorderLayout());//新建面板并让其使用边界布局管理器
        JButton centerButton=new JButton("我是中央军区");//创建按钮,并为其赋一个名字
        JButton northButton=new JButton("我是北部军区");
        JButton southButton=new JButton("我是南部军区");
        JButton westButton=new JButton("我是西部军区");
        JButton easterButton=new JButton("我是东部军区");
        p3.add(centerButton, BorderLayout.CENTER);//把按钮添加到面板3的指定位置
        p3.add(northButton, BorderLayout.NORTH);
        p3.add(southButton, BorderLayout.SOUTH);
        p3.add(westButton, BorderLayout.WEST);
        p3.add(easterButton, BorderLayout.EAST);
        c.add(p3);//把面板p3添加到容器中

        setBounds(100, 100, 300, 300);
        setVisible(true);
    }
    public static void main(String[] args) {
        new JPanelTest();
    }
}

输出结果:

边界布局管理器和网格布局管理器一样,他们中的每一个组件的相对位置都不会随着窗体大小的变化而变化
注意:
1、我们一定要区分开容器的布局和面板的布局,容器的布局是大类,它控制着每一个面板的排放位置,而面板的布局是小类,它控制的是我们面板内部的排放位置
2、只有使用流布局管理器的时候,各个组件的大小才不会变化,但是组件的相对位置会发生变化;其他布局管理器中组件的大小都会随着窗体的大小变化而变化,但是组件的相对位置不会发生变化。这在以后用到文本框的时候就有所体会了
面板和布局管理器就暂时先写到这里,关于面板的其他内容再在其他文章中写。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐