Java容器、面板及布局管理器讲解

容器

在Java的GUI界面设计中,容器是存放控件的地方,而这个地方依托在窗体之上,常用的容器是container。

Swing组件中的窗体通常是与容器相关联的,所以在一般情况下,建立完JFrame窗体后,我们会调用getContentPane()方法将窗体转换为容器,之后再在该容器中添加控件或布局管理器。

面板

面板也是一个容器,但是这个容器必须添加在其他的容器中,常用的面板有两种,分别是JPanel面板和JScrollPane面板。

Jpanel

在JPanel面板中我们可以添加一些组件来对该面板中的内容进行布局,因为JPanel面板同样也继承了java.awt.Container类,因此它同样是具有Container容器的功能,

注意:JPanel面板必须添加在其他容器中。

因此我们可以理解为JPanel面板其实就是对一个大的容器的划分,将Container容器根据一定的规则(布局管理)划分成了一个个小的面板。因此JPanel面板的使用一般是与布局管理器相结

JScrollPane

应用场景:在一个较小的界面中显示一个较大的内容的情况,方法就是将较小的容器设置为JScrollPane面板,原因是因为JScrollPane面板是自带滚动条的,并且同时它也是一种容器。
使用JScrollPane面板时需要注意以下两个问题:

1,JScrollPane面板中只能布置一个控件,
2,JScrollPane面板不能使用布局管理器

因此如果想要在JScrollPane面板中显示多个控件,就需要首先将控件布局在JPanel面板中,之后将JPanel面板作为一个整体组件添加到JScrollPane面板中。

布局管理器

布局管理器提供了一种对swing组件的排版方式,因此使用布局管理器就可以很有效的处理整个窗体中组件的布局方式。常用的有流布局管理器、边界布局管理器、网格布局管理器。

流布局管理器

流布局管理器(FlowLayout)具有的特点就是:在其中的组件可以像“流”一样按照从左到右的顺序依次的排列,直到该行排列完毕后再从下一行继续排列。

package test;
import javax.swing.JFrame;
import javax.swing.*;
import java.awt.*;

public class liushui {
    public static void main(String[] args)
    {
        MyFrame frame=new MyFrame();
    }
}
class MyFrame extends JFrame
{
    JButton[] b=new JButton[10];
    MyFrame()
    {
        this.setSize(300,200);
        Container container=this.getContentPane();
        FlowLayout f=new FlowLayout(FlowLayout.CENTER,100,10);
        container.setLayout(f);


        for(int i=0;i<10;i++)
        {
            b[i]=new JButton("按钮"+i);
            container.add(b[i]);

        }
        this.setTitle("流布局管理器");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }
}

在这里插入图片描述

网格布局管理器

网格布局管理器(GridLayout)就是将容器按照行列划分成特定的网格,在网格布局管理器中每一个网格的大小都是一样的,并且网格中格子的个数是由划分的行和列决定的,如一个两行两列的网格布局,将会划分成四个大小相同的网格。

在网格布局中的组将会按照从左到右、从上到下的顺序加入到网格中,而且加入到网格中的组件都会将网格填满,同时改变窗体的大小,网格的大小也会随之改变。

package test;
import javax.swing.JFrame;
import javax.swing.*;
import java.awt.*;

public class wangge {
    public static void main(String[] args)
    {
        MyFramegrid frame=new MyFramegrid();
    }
}
class MyFramegrid extends JFrame
{
    JButton[] b=new JButton[10];
    MyFramegrid()
    {
        this.setSize(300,200);
        Container container=this.getContentPane();
        GridLayout g=new GridLayout(3,4,10,10);
        container.setLayout(g);


        for(int i=0;i<b.length;i++)
        {
            b[i]=new JButton("按钮"+i);
            container.add(b[i]);

        }
        this.setTitle("网格布局管理器");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }
}

在这里插入图片描述

边界布局管理器

在默认不指定窗体布局的情况下,Swing组件的布局模式就是边界布局(BorderLayout),该布局管理器的特征就是组件会按照一定要求布满整个容器的边界。

边界布局管理器可以将容器划分成东、南、西、北、中五个区域,在容器中添加组件时,我们可以设置组将放入到哪一个区域中,关于区域的控制可以使用BorderLayout类中的成员方法来确定。

package test;
import javax.swing.JFrame;
import javax.swing.*;
import java.awt.*;

public class bianjie {
    public static void main(String[] args)
    {
        MyFrameBorder frame=new MyFrameBorder();
    }
}
class MyFrameBorder extends JFrame
{
    MyFrameBorder()
    {
        this.setSize(300,200);
        Container container=this.getContentPane();
        BorderLayout b=new BorderLayout(10,10);
        container.setLayout(b);


        container.add(new JButton("东面"),BorderLayout.EAST);
        container.add(new JButton("南面"),BorderLayout.SOUTH);
        container.add(new JButton("西面"),BorderLayout.WEST);
        container.add(new JButton("北面"),BorderLayout.NORTH);
        container.add(new JButton("中间"),BorderLayout.CENTER);
        this.setTitle("边界布局管理器");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }
}

在这里插入图片描述

综合关系

面板应该设置在容器之中,

布局管理器可以设置在容器或面板之中,

布局管理器中还可以嵌套面板,在该面板中还可以再添加布局管理器。

下面代码嵌套使用了三者:

package test;
import javax.swing.JFrame;
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;

public class jpanel {
    public static void main(String[] args)
    {
        MyFramePanel frame=new MyFramePanel();
    }
}
class MyFramePanel extends JFrame
{
    JButton b1=new JButton("登录");
    JButton b2=new JButton("取消");
    JTextField t1=new JTextField(15);
    JTextField t2=new JTextField(15);
    JLabel l1=new JLabel("用户账号");
    JLabel l2=new JLabel("登录密码");
    JPanel p1=new JPanel();
    JPanel p2=new JPanel();
    JPanel p3=new JPanel();
    JPanel p4=new JPanel();
    MyFramePanel()
    {
        this.setSize(300,200);
        Container container=this.getContentPane();
        FlowLayout fleft=new FlowLayout(FlowLayout.CENTER,10,10);
        FlowLayout fright=new FlowLayout(FlowLayout.RIGHT,10,10);
        BorderLayout border=new BorderLayout(10,10);
        GridLayout g=new GridLayout(2,1);
        container.setLayout(border);
        p1.setLayout(fleft);
        p2.setLayout(fleft);
        p3.setLayout(fright);
        p4.setLayout(g);
        p1.add(l1);
        p1.add(t1);
        p2.add(l2);
        p2.add(t2);
        p3.add(b1);
        p3.add(b2);
        p4.add(p1);
        p4.add(p2);
        container.add(p4, BorderLayout.CENTER);
        container.add(p3, BorderLayout.SOUTH);
        this.setTitle("面板应用");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }
}


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值