EchoDemo's Blogs

Java中的布局管理器

1、容器内可以存放各种组件,而组件的位置和大小是由容器内的布局管理器来决定的。在AWT中为我们提供了以下五种布局管理器。FlowLayout布局管理器、BorderLayout边界布局管理器、GridLayout网格布局管理器、CardLayout卡片布局管理器、
GridBagLayout网格包布局管理器。

2、容器中组件的布局通常由布局管理器控制。每个Container(比如一个Panel或一个Frame)都有一个与它相关的缺省布局管理器,Panel容器默认是FlowLayout,Frame容器默认是BorderLayout,我们可以通过调用setLayout()来改变布局管理器。

3、我们可以通过设置空布局管理器,来控制组件的大小和位置。可以调用setLayout(null)。在设置空布局管理器之后,必须对所有的组件调用setLocation(),setSize()或者setBounds(),将它们定位在容器中。

4、FlowLayout布局管理器:流程布局通常用于布置面板中的按钮。 它可以水平排列按钮,直到不再有按钮在同一行上。 线对齐由align属性确定。 可能的值是:LEFT、RIGHT、CENTER、LEADING、TRAILING。

package com.iotek.awt;

import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;

public class FlowLayoutDemo {

    public static void main(String[] args) {
        MyFrame3 frame3=new MyFrame3("FlowLayout");
        frame3.init();

    }
}

class MyFrame3 extends Frame{
    public MyFrame3(String title){
        super(title);
    }
    public void init(){
        //FlowLayout layout=new FlowLayout();//构造一个新的 FlowLayout中心对齐和默认的5单位水平和垂直间隙。 
        //FlowLayout layout=new FlowLayout(FlowLayout.LEFT);//构造一个新的 FlowLayout左对齐和默认的5单位水平和垂直间隙。 
        FlowLayout layout=new FlowLayout(FlowLayout.RIGHT,50,50);//构造一个新的 FlowLayout右对齐和默认的5单位水平和垂直间隙均为50。 

        this.setLayout(layout);
        this.setBackground(Color.cyan);
        this.add(new Button("btn1"));//添加按钮
        this.add(new Button("btn2"));
        this.add(new Button("btn3"));
        this.add(new Button("btn4"));
        this.add(new Button("btn5"));
        this.add(new Button("btn6"));
        this.add(new Button("btn7"));
        this.add(new Button("btn8"));
        this.setSize(300, 200);
        this.setVisible(true);
    }
}

5、BorderLayout布局管理器:边界布局设置了一个容器,安排和调整其组件,以适应五个区域:北,南,东,西和中心。 每个区域可以含有不超过一个部件,并且通过相应的常数确定: NORTH , SOUTH , EAST , WEST和CENTER 。

package com.iotek.awt;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;

public class BorderLayoutDemo {

    public static void main(String[] args) {
        MyFrame4 frame4=new MyFrame4("BorderLayout");
        frame4.init();
    }
}

class MyFrame4 extends Frame{
    public MyFrame4(String title){
        super(title);
    }
    public void init(){
        this.setBackground(Color.cyan);
        this.add(new Button("btn1"),BorderLayout.EAST);//添加按钮在东边
        this.add(new Button("btn2"),BorderLayout.WEST);
        this.add(new Button("btn3"),BorderLayout.NORTH);
        this.add(new Button("btn4"),BorderLayout.SOUTH);
        this.add(new Button("btn5"),BorderLayout.CENTER);
        this.setSize(300, 200);
        this.setVisible(true);
    }
}

6、GridLayout布局管理器:它将一个容器的组件放在矩形网格中。 容器被分成等大小的矩形,并且每个矩形中放置一个组件。当行数和列数都被设置为非零值时,无论是通过构造函数还是setRows和setColumns方法,都会忽略指定的列数。而是从指定的行数和布局中的组件总数确定列的数量。因此,例如,如果已经指定了三行和两列,并且将九个组件添加到布局,则它们将显示为三列三列。仅当行数设置为零时,才指定列数影响布局。

package com.iotek.awt;

import java.awt.Button;
import java.awt.Color;
import java.awt.Frame;
import java.awt.GridLayout;

public class GridLayoutDemo {

    public static void main(String[] args) {
        MyFrame5 frame5=new MyFrame5("GridLayout");
        frame5.init();
    }
}

class MyFrame5 extends Frame{
    public MyFrame5(String title){
        super(title);
    }
    public void init(){
        //GridLayout gridLayout=new GridLayout();//在单个行中创建一个每个组件的默认值为一列的网格布局。 
        //GridLayout gridLayout=new GridLayout(3,2);//创建具有指定行数和列数的网格布局。
        GridLayout gridLayout=new GridLayout(3,2,10,10);//创建具有指定行数和列数的网格布局,且指定水平和垂直间隔。
        this.setLayout(gridLayout);
        this.setBackground(Color.cyan);
        this.add(new Button("btn1"));
        this.add(new Button("btn2"));
        this.add(new Button("btn3"));
        this.add(new Button("btn4"));
        this.add(new Button("btn5"));
        this.add(new Button("btn6"));
        this.add(new Button("btn7"));
        this.setSize(300, 200);
        this.setVisible(true);
    }
}

7、 CardLayout布局管理器:它将容器中的每个组件视为一张卡。 一次只能看到一张卡片,容器就是一堆卡片。添加到CardLayout对象的第一个组件是首次显示容器时的可见组件。卡片的顺序由容器自己的组件对象的内部顺序决定。CardLayout定义了一组允许应用程序顺序翻转这些卡片或显示指定卡片的方法。 addLayoutComponent(java.awt.Component, java.lang.Object)方法可用于将字符串标识符与给定卡相关联,以便快速随机访问。

package com.iotek.awt;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.CardLayout;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextField;

public class CardLayoutDemo {

    public static void main(String[] args) {
        MyFrame6 frame6=new MyFrame6("CardLayout");
        frame6.init();
    }
}

class MyFrame6 extends Frame{

    private Panel card_panel=null;
    private Panel ctrol_panel=null;
    private CardLayout cardLayout=null;
    private FlowLayout flowLayout=null;
    private Label lb_1,lb_2,lb_3,lb_4;
    private TextField tf_contentField;
    private Button btn_1,btn_2,btn_3,btn_4;

    public MyFrame6(String title){
        super(title);
    }
    /*
     * 在一个窗口当中设置两个面板,上面的面板设置成CardLayout布局管理器,下面的面板设置成FlowLayout布局管理器。
     * 由于Frame默认是BorderLayout布局管理器,将上面的面板放进窗体的Center位置,下面的面板放在South位置。
     */
    public void init(){
        //创建两个面板容器
        card_panel=new Panel();
        ctrol_panel=new Panel();
        //创建两个布局管理器
        cardLayout=new CardLayout();
        flowLayout=new FlowLayout();
        //给面板容器设定指定的布局管理器
        card_panel.setLayout(cardLayout);
        ctrol_panel.setLayout(flowLayout);
        //声明创建四个标签控件和一个文本框控件。
        lb_1=new Label("First Page",Label.CENTER);
        lb_2=new Label("Second Page",Label.CENTER);
        tf_contentField=new TextField();//编辑文本框
        lb_3=new Label("Third Page",Label.CENTER);
        lb_4=new Label("Forth Page",Label.CENTER);
        //构建四个按钮对象
        btn_1=new Button("First");
        btn_2=new Button("Second");
        btn_3=new Button("Third");
        btn_4=new Button("Forth");
        //把按钮添加到控制面板
        ctrol_panel.add(btn_1);
        ctrol_panel.add(btn_2);
        ctrol_panel.add(btn_3);
        ctrol_panel.add(btn_4);
        //把四个标签控件和一个文本框控件添加到card_panel容器中。
        card_panel.add(lb_1);
        card_panel.add(lb_2);
        card_panel.add(tf_contentField);
        card_panel.add(lb_3);
        card_panel.add(lb_4);
        this.add(card_panel,BorderLayout.CENTER);
        this.add(ctrol_panel,BorderLayout.SOUTH);

        this.setSize(400, 300);
        this.setVisible(true);
    }
}
🐶 您的支持将鼓励我继续创作 🐶
-------------本文结束感谢您的阅读-------------