java笔记 常用容器和常用布局器

一.常用容器

面板JPanel(默认布局方式为FlowLayout)是一个容器,之前学的窗口JFrame也是容器
然而JPanel更像一个中间容器
在一个窗口中,不同的容器有不同的布局
方便管理

注:add(new JScrollPane(textArea));可以使这个文本框带滚动条

二.布局器

布局器是在awt包里面的

1.FlowLayout()

import java.awt.*;
import javax.swing.*;
//定义带有按钮的Frame

class myFlowLayoutFrame extends JFrame
{
    
    
    private int buttons;

    public myFlowLayoutFrame(int buttonNumber)
    {
    
    
        buttons = buttonNumber;  // 设置按钮数量
        setTitle("FlowLayout布局的窗体");
        setSize(320,240);
        Panel buttonPanel = new Panel();
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        //增加相应的按钮
        for(int i=0;i<buttons;i++)
        {
    
    
            Button addButton=new Button("按钮"+(i+1));
            buttonPanel.add(addButton);
        }

        //Panel的默认布局管理器是FlowLayout,此处修改参数
        //FlowLayout(对齐方式,横向间隙,纵向间隙)
        buttonPanel.setLayout(new FlowLayout(1,10,80));  // 0左对齐,1居中,2右对齐
        //Frame的默认布局管理器为BorderLayout
        this.add(buttonPanel);
    }
}

public class test
{
    
    
    public static void main(String[] args)
    {
    
    
        //显示的按钮数目
        int buttonNumber=18;
        myFlowLayoutFrame frm = new myFlowLayoutFrame(buttonNumber);
        frm.setVisible(true);
    }
}

在这里插入图片描述

2.BorderLayout

//BorderLayout之例
import javax.swing.*;
import java.awt.*;

class myBorderLayoutFrame extends JFrame
{
    
    
    public myBorderLayoutFrame()
    {
    
    
        super("BorderLayout布局的窗口");
        Panel myPanel = new Panel();
        myPanel.setLayout(new BorderLayout());
        
        JButton north=new JButton("北面");
        JButton south=new JButton("南面");
        JButton east=new JButton("东面");
        JButton west=new JButton("西面");
        JButton center=new JButton("中心");
        myPanel.add(north, BorderLayout.NORTH);  //显示上按钮
        myPanel.add(south, BorderLayout.SOUTH);
        myPanel.add(east, BorderLayout.EAST);    //显示东按钮
        myPanel.add(west, BorderLayout.WEST);
        myPanel.add(center, BorderLayout.CENTER);//显示中心按钮
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        this.add(myPanel);
        this.setSize(320,240);

        this.setVisible(true);
    }
}
public class test
{
    
    
    public static void main(String args[])
    {
    
    
        myBorderLayoutFrame frm = new myBorderLayoutFrame();
    }
}

在这里插入图片描述

3.CardLayout

//CardLayout之例
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class myCardLayoutFrame extends JFrame
        implements ActionListener
{
    
    
    CardLayout mycard;
    JButton buttonFirst,buttonLast,buttonNext;
    Panel pCenter;

    myCardLayoutFrame()  //构造函数
    {
    
    
        setTitle("CardLayout布局的窗体");
        mycard = new CardLayout();
        pCenter = new Panel();  // 中间的容器
        pCenter.setLayout(mycard);//设置CardLayout布局
        buttonFirst = new JButton("第一个");
        buttonLast = new JButton("末一个");
        buttonNext = new JButton("下一个");

        for(int i=1;i<=20;i++)
        {
    
    
            pCenter.add(new JButton("我是第 "+i+" 个按钮"));  // 这些按钮必须被存在一个面板容器中
        }

        //给按钮添加事件监听器
        buttonFirst.addActionListener(this);
        buttonLast.addActionListener(this);
        buttonNext.addActionListener(this);

        //添加带有按钮的panel
        Panel pSouth = new Panel();  // 下面的容器
        pSouth.add(buttonFirst);
        pSouth.add(buttonNext);
        pSouth.add(buttonLast);
        add(pCenter, BorderLayout.CENTER);
        add(pSouth, BorderLayout.SOUTH);
        setBounds(0,0,320,240);

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    //按钮事件处理
    public void actionPerformed(ActionEvent e)
    {
    
    
        if(e.getSource() == buttonFirst)
        {
    
    
            mycard.first(pCenter);  // 必须要有参数,确定这个first是哪个容器的
        }
        else if(e.getSource() == buttonNext)
        {
    
    
            mycard.next(pCenter);
        }
        else if(e.getSource() == buttonLast)
        {
    
    
            mycard.last(pCenter);
        }
    }
}

public class test{
    
    
    public static void main(String args[])
    {
    
    
        myCardLayoutFrame frm = new myCardLayoutFrame();
    }
}

在这里插入图片描述

4.GridLayout

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

class myGridLayoutFrame extends JFrame
{
    
    
    JButton[] buttons = new JButton[20];

    public myGridLayoutFrame()
    {
    
    
        super("GridLayout布局的窗体");

        setSize(320,240);
        setLayout(new GridLayout(4,5));  // 4行5列

        for(int i=0;i<buttons.length;i++)
        {
    
    
            buttons[i] = new JButton(""+ (i+1) ); // 只输入i+1不能识别为字符串标号,所以利用一个小技巧将int转为string
            add(buttons[i]);
        }
    }
}

public class test
{
    
    
    public static void main(String args[])
    {
    
    
        myGridLayoutFrame frm = new myGridLayoutFrame();
        frm.show();
    }
}

在这里插入图片描述

5.GirdBagLayout

//GridBagLayout之例
import java.awt.*;
import javax.swing.*;

class myGridBagFrame extends JFrame
{
    
    
    public myGridBagFrame()
    {
    
    
        super("GridBagLayout布局的窗体");
        Panel panel1 = new Panel();
        setSize(500,500);
        panel1.setLayout(new GridBagLayout());

        GridBagConstraints gbdc = new GridBagConstraints();
        gbdc.fill=GridBagConstraints.BOTH; //向两面扩张

        gbdc.weightx=1; //设置行(weightx)的量
        gbdc.weighty=1;
        gbdc.gridwidth=2; //添加进入的部件就会变成为2个单元格的宽度。
        gbdc.gridx=0; //另起一行,从x = 0的单元格开始填充。
        panel1.add(new JButton("No.1"), gbdc);

        gbdc.gridx=2;  //从x = 2的单元格开始填充。
        gbdc.gridwidth=1;
        gbdc.gridheight=2;
        panel1.add(new JButton("No.2"), gbdc);

        gbdc.gridx=0;  //
        gbdc.gridheight=1;
        panel1.add(new JButton("No.3"), gbdc);

        gbdc.gridx=1;
        panel1.add(new JButton("No.4"), gbdc);

        gbdc.gridx = 3;
        gbdc.gridwidth = 1;
        gbdc.gridheight = 1;
        panel1.add(new JButton("No.5"), gbdc);

        //gbdc.gridx = 0;  // 每当gbdc.gridx重新设定为0时,就代表新建了一行
        //gbdc.gridwidth = 1;
        //gbdc.gridheight = 1;
        //panel1.add(new JButton("No.6"), gbdc);

        add(panel1);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
}

public class test
{
    
    
    public static void main(String args[])
    {
    
    
        myGridBagFrame frm= new myGridBagFrame();
        frm.setVisible(true);
    }
}

在这里插入图片描述

weightx,weighty:用来设置窗口变大时,各组件跟着变大的比例,当数字越大,表示组件能得到更多的空间,默认值皆为0。
这个我还是不知道有什么用,设置为0的话就是按钮原大小,其他值都是一样的效果。

这种布局器是控制每个组件的,先设设置布局器的位置大小,再设置按钮
而且这种布局是铺满整个面板的,每个组件的大小 <= 面板的大小
如果按钮5的宽设为3,显示的大小还是2,如果是1,就会空缺一部分
而且这种布局不能隔行新建,也就是不能中间空一行什么组件都不添加


如果新建一个6,再把5的宽设定为3,就能显示了
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/yogur_father/article/details/108968594
今日推荐