java-swing-布局

万般皆苦,唯有自渡。

布局概念

  • 概念:组件在容器(比如JFrame)中的位置和大小是由布局管理器(layout mnager)来决定的。所有的容器都会使用一个布局管理器,通过它来自动进行组件的布局管理。
  • 种类:java共提供了五种布局管理器:流式布局管理器(FlowLayout)、边界布局管理器(BorderLayout)、网格布局管理器(GridLayout)、卡片布局管理器(CardLayout)、网格包布局管理器(GridBagLayout)。其中前三种是最常见的布局管理器。
  • 将组件加入到容器中之前,必须建立容器的布局管理器,如果没有指定布局管理器,将使用默认的布局管理器。:对于面板,默认为FlowLayout;对于框架和窗口,默认为:BorderLayout。
  • 创建布局管理器后,使用setLayout()使得容器和布局关联起来。

布局介绍

顺序布局(FlowLayout)

  • 类FlowLayout是最简单的布局管理器,它排列组件的方式和图书排版类似:从左到右排列,到达末尾后,进入下一行。
  • 默认情况下,如果调用构造函数FlowLayout()时,没有提供任何参数,每一行的组件都会居中排列。要让组件右对齐或者左对齐,必须将类变量FlowLayout.LEFT或FlowLayout.RIGHT作为唯一的参数传递给构造函数。

常用方法

构造方法
FlowLayout() 
          构造一个新的 FlowLayout,它是居中对齐的,默认的水平和垂直间隙是 5 个单位。 
FlowLayout(int align) 
          构造一个新的 FlowLayout,它具有指定的对齐方式,默认的水平和垂直间隙是 5 个单位。 
FlowLayout(int align, int hgap, int vgap) 
          创建一个新的流布局管理器,它具有指定的对齐方式以及指定的水平和垂直间隙。 
普通方法
 void addLayoutComponent(String name, Component comp) 
          将指定的组件添加到布局中。 
 int getAlignment() 
          获取此布局的对齐方式。 
 boolean getAlignOnBaseline() 
          如果组件将沿其基线垂直对齐,则返回 true。 
 int getHgap() 
          获取组件之间以及组件与 Container 的边之间的水平间隙。 
 int getVgap() 
          获取组件之间以及组件与 Container 的边之间的垂直间隙。 
 void layoutContainer(Container target) 
          布置该容器。 
 Dimension minimumLayoutSize(Container target) 
          返回需要布置 visible 组件的最小维数,该组件包含在指定的目标容器中。 
 Dimension preferredLayoutSize(Container target) 
          给出指定目标容器中的 visible 组件,返回此布局的首选维数。 
 void removeLayoutComponent(Component comp) 
          从布局中移除指定的组件。 
 void setAlignment(int align) 
          设置此布局的对齐方式。 
 void setAlignOnBaseline(boolean alignOnBaseline) 
          设置组件是否应该沿着其基线垂直对齐。 
 void setHgap(int hgap) 
          设置组件之间以及组件与 Container 的边之间的水平间隙。 
 void setVgap(int vgap) 
          设置组件之间以及组件与 Container 的边之间的垂直间隙。 

案例

package SwingDemo;

import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class swingDemo {
	public static void main(String[] args) {
	JFrame mainFrame = new JFrame("测试界面");
	     mainFrame.setSize(300, 300);
		 JPanel panel = new JPanel();
        JButton btn[]=new JButton[12];
       panel.setLayout(new FlowLayout(FlowLayout.LEFT));
       
        for(int i=0;i<10;i++){
        	btn[i] = new JButton("button"+i);
        	btn[i].setPreferredSize(new Dimension(50+5*i, 30+5*i));
        	//设置按钮大小,在已经有布局的情况下,setSize()是失效的。
        	panel.add(btn[i]);
        } 
		 mainFrame.setContentPane(panel);
		 mainFrame.setVisible(true);
	}
}

运行结果

边界布局管理器(BorderLayout)

  • 边框布局是使用类BorderLayout创建的,它将容器分为5部分:北、南、东、西和中央。
  • 在边框布局中,位于四个罗盘方位的组件将根据其需要占据相应的空间,余下的空间将属于中央区域。通常,中央是一个大组件,四周是四个小组件。

方法概述

构造方法
BorderLayout() 
          构造一个组件之间没有间距的新边框布局。 
BorderLayout(int hgap, int vgap) 
          构造一个具有指定组件间距的边框布局。 
普通方法
 void addLayoutComponent(Component comp, Object constraints) 
          使用指定的约束对象将指定组件添加到布局中。 
 int getHgap() 
          返回组件之间的水平间距。 
 float getLayoutAlignmentX(Container parent) 
          返回沿 x 轴的对齐方式。 
 float getLayoutAlignmentY(Container parent) 
          返回沿 y 轴的对齐方式。 
 int getVgap() 
          返回组件之间的垂直间距。 
 void invalidateLayout(Container target) 
          使布局无效,指示如果布局管理器缓存了信息,则应该将其丢弃。 
 void layoutContainer(Container target) 
          使用此边框布局对容器参数进行布局。 
 Dimension maximumLayoutSize(Container target) 
          在给出指定目标容器中的组件的前提下,返回此布局的最大尺寸。 
 Dimension minimumLayoutSize(Container target) 
          使用此布局管理器确定 target 容器的最小大小。 
 Dimension preferredLayoutSize(Container target) 
          基于容器中的组件,使用此布局管理器确定 target 容器的首选大小。 
 void removeLayoutComponent(Component comp) 
          从此边框布局中移除指定组件。 
 void setHgap(int hgap) 
          设置组件之间的水平间距。 
 void setVgap(int vgap) 
          设置组件之间的垂直间距 

案例

package SwingDemo;

import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class swingDemo {
	public static void main(String[] args) {
	JFrame mainFrame = new JFrame("测试界面");
	     mainFrame.setSize(300, 300);
		 JPanel panel = new JPanel();
        JButton btn[]=new JButton[5];
       panel.setLayout(new BorderLayout(5,10));
       String dir[] =new String[]{"North","South","East","West","Center"};
        for(int i=0;i<5;i++){
        	btn[i] = new JButton("button"+i);
        	panel.add(btn[i],dir[i]);
        } 
		 mainFrame.setContentPane(panel);
		 mainFrame.setVisible(true);
	}
}

运行结果

网格布局(GridLayout)

  • 网格布局管理器将组件放置到由行和列组成的网格中。首先组件被加入到网格的第一行,并从最左边的网格开始,依次向右排列。第一行的单元格排满后,接下来的组件将加入到第二行最左边的单元格中(如果有第二行)。
  • 方法将行数和列数都设置为非零值时,指定的列数将被忽略。列数通过指定的行数和布局中的组件总数来确定。
构造方法
GridLayout() 
          创建具有默认值的网格布局,即每个组件占据一行一列。 
GridLayout(int rows, int cols) 
          创建具有指定行数和列数的网格布局。 
GridLayout(int rows, int cols, int hgap, int vgap) 
          创建具有指定行数和列数的网格布局。 
普通方法概述
void addLayoutComponent(String name, Component comp) 
          将具有指定名称的指定组件添加到布局。 
 int getColumns() 
          获取此布局中的列数。 
 int getHgap() 
          获取组件之间的水平间距。 
 int getRows() 
          获取此布局中的行数。 
 int getVgap() 
          获取组件之间的垂直间距。 
 void layoutContainer(Container parent) 
          使用此布局布置指定容器。 
 Dimension minimumLayoutSize(Container parent) 
          使用此网络布局确定最小大小的容器参数。 
 Dimension preferredLayoutSize(Container parent) 
          使用此网格布局确定容器参数的首选大小。 
 void removeLayoutComponent(Component comp) 
          从布局移除指定组件。 
 void setColumns(int cols) 
          将此布局中的列数设置为指定值。 
 void setHgap(int hgap) 
          将组件之间的水平间距设置为指定值。 
 void setRows(int rows) 
          将此布局中的行数设置为指定值。 
 void setVgap(int vgap) 
          将组件之间的垂直间距设置为指定值。  

案例

package SwingDemo;

import java.awt.BorderLayout;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class swingDemo {
	public static void main(String[] args) {
	JFrame mainFrame = new JFrame("测试界面");
	     mainFrame.setSize(300, 300);
		 JPanel panel = new JPanel();
        JButton btn[]=new JButton[39];
       panel.setLayout(new GridLayout(10,11));
       //指定的列数将被忽略。列数通过指定的行数和布局中的组件总数来确定。
        for(int i=0;i<39;i++){
        	btn[i] = new JButton(""+i);
        	panel.add(btn[i]);
        } 
		 mainFrame.setContentPane(panel);
		 mainFrame.setVisible(true);
	}
}

运行结果

卡片布局(CardLayout)

  • 对于选项卡这个概念大家可能不会陌生,就是在一个窗口中可以切换显示多页不同的内容,但同一时间只能是其中的某一页可见的,这样的一个个的页面就是选项卡。
  • CardLayout就是类似的这样一个布局管理器,它能够让多个组件共享同一个显示空间,共享空间的组件之间的关系就像重叠在一起的一幅扑克牌,组件重叠在一起,初始时显示该空间中第一个组件,通过CardLayout类提供的方法可以切换该空间中显示的组件。

方法概述

构造方法
CardLayout() 
          创建一个间距大小为 0 的新卡片布局。 
CardLayout(int hgap, int vgap) 
          创建一个具有指定水平间距和垂直间距的新卡片布局。 
普通方法概述
 void addLayoutComponent(Component comp, Object constraints) 
          将指定的组件添加到此卡片布局的内部名称表。 
 void first(Container parent) 
          翻转到容器的第一张卡片。 
 int getHgap() 
          获取组件之间的水平间距。 
 int getVgap() 
          获取组件之间的垂直间距。 
 void invalidateLayout(Container target) 
          使布局无效,指示如果布局管理器缓存了信息,则应该将其丢弃。 
 void last(Container parent) 
          翻转到容器的最后一张卡片。 
 void layoutContainer(Container parent) 
          使用此卡片布局布置指定的容器。 
 void next(Container parent) 
          翻转到指定容器的下一张卡片。 
 void previous(Container parent) 
          翻转到指定容器的前一张卡片。 
 void removeLayoutComponent(Component comp) 
          从布局中移除指定的组件。 
 void setHgap(int hgap) 
          设置组件之间的水平间距。 
 void setVgap(int vgap) 
          设置组件之间的垂直间距。 
 void show(Container parent, String name) 
          翻转到使用 addLayoutComponent 添加到此布局的具有指定 name 的组件。

案例

package SwingDemo;

import java.awt.CardLayout;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class swingDemo {
	public static void main(String[] args) {
	JFrame mainFrame = new JFrame("测试界面");
	     mainFrame.setSize(300, 300);
		 JPanel panel = new JPanel();
		 CardLayout cdLayout =new CardLayout();
       panel.setLayout(cdLayout);
       JPanel first =new JPanel();//第一个卡片
       first.add(new JButton("第一个卡片"));//卡片里的内容
       panel.add(first);//将卡片加入到框架上的面板上
       JPanel center = new JPanel();
       center.add(new JButton("中间的卡片"));
       panel.add(center);
       JPanel last = new JPanel();
       last.add(new JButton("最后的卡片"));
       panel.add(last);
       mainFrame.setContentPane(panel);
		 mainFrame.setVisible(true);
       while(true){
    	   try {
			Thread.sleep(1000);//暂停1s
			cdLayout.next(panel);//切换到下一个卡片
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
       }
       
		 
	}
}

运行结果

网格袋布局(GridBagLayout)

  • 网格袋布局是对网格布局的一种扩展,相对于网格布局:
    (1):组件可占据网格中的多个单元格
    (2):不同行和列的比例不必相同
    (3):单元格中的组件可以以不同的方式排列

  • 要创建网格袋布局,可以使用GridBagLayout类和助手类GridBagConstraints。GridBagLayout是布局管理器,GridBagConstraints用于定义要放置到单元格中的每个组件的属性-包括布局、大小、对齐方式等。

GridBagLayout方法

构造方法
GridBagLayout() 
          创建网格包布局管理器。
普通方法
 void setConstraints(Component comp, GridBagConstraints constraints) 
          设置此布局中指定组件的约束条件。 
 void addLayoutComponent(Component comp, Object constraints) 
          使用指定 constraints 对象将指定组件添加到布局中。 
 GridBagConstraints getConstraints(Component comp) 
          获取指定组件的约束。 
 void invalidateLayout(Container target) 
          使布局失效,指示如果布局管理器缓存了信息,则应该将其丢弃。 
 void layoutContainer(Container parent) 
          使用此网格包布局布置指定容器。 
 Point location(int x, int y) 
          确定在布局网格中哪个单元包含由 (x, y) 指定的点。 
protected  GridBagConstraints lookupConstraints(Component comp) 
          检索指定组件的约束。 
 void removeLayoutComponent(Component comp) 
          从此布局移除指定组件。 

GridBagConstraints的方法

 int gridheight 
          指定在组件显示区域的一列中的单元格数。 
 int gridwidth 
          指定组件显示区域的某一行中的单元格数。 
 int gridx 
          指定包含组件的显示区域开始边的单元格,其中行的第一个单元格为 gridx=0。 
 int gridy 
          指定位于组件显示区域的顶部的单元格,其中最上边的单元格为 gridy=0。 
 double weightx 
          指定如何分布额外的水平空间。 
 double weighty 
          指定如何分布额外的垂直空间。 
int fill 
       组件完全填充单元格的方式
            NONE:不调整组件大小。 //默认情况,这是不填充
			HORIZONTAL:加宽组件,使它在水平方向上填满其显示区域,但是不改变高度。 
			VERTICAL:加高组件,使它在垂直方向上填满其显示区域,但是不改变宽度。 
			BOTH:使组件完全填满其显示区域。 
 int anchor 
          当组件不完全填充单元格时,组件应该放在单元格哪个位置 
          绝对值有:CENTER、NORTH、NORTHEAST、EAST、SOUTHEAST、
          SOUTH、SOUTHWEST、WEST 和 NORTHWEST。

创建网格袋布局的步骤:
(1):创建一个GridBagLayout对象,并将其指定为当前的布局管理器。
(2):创建一个GridBagConstraints实例
(3):设置组件的约束条件
(4):将组件及其约束条件告诉布局管理器
(5):将组件加入到容器中。

使用 步骤实例

package SwingDemo;

import java.awt.CardLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class swingDemo {
	public static void main(String[] args) {
	JFrame mainFrame = new JFrame("测试界面");
	     mainFrame.setSize(300, 300);
		 JPanel panel = new JPanel();
	    GridBagLayout gbLayout =new GridBagLayout();
	    GridBagConstraints gbBagConstraints=new GridBagConstraints();
	    panel.setLayout(gbLayout);
	    
	    //要添加的组件
	    JButton btn1 = new JButton("按钮");
	    
	    //设置组件的约束条件
	    gbBagConstraints.gridx =0;
	    gbBagConstraints.gridy=0;
	    gbBagConstraints.gridwidth=1;
	    gbBagConstraints.gridheight=1;
	    gbBagConstraints.weightx=30;
	    gbBagConstraints.weighty=30;
	    gbBagConstraints.fill = GridBagConstraints.NONE;
	    gbBagConstraints.anchor = GridBagConstraints.CENTER;
	    
	    //将组件及约束条件告诉布局管理器
	    gbLayout.setConstraints(btn1, gbBagConstraints);
	   //将组件添加到面板上 
	    panel.add(btn1);
	    
       mainFrame.setContentPane(panel);
		 mainFrame.setVisible(true);
    
	}
}

为了减少设置约束条件时的输入量,可以先定义一个助手方法

public static void buildConstraints(GridBagConstraints con,int gx,int gy,int gw,int gh,int wx,int wy){
		con.gridx = gx,//起始位置单元格
		con.gridy= gy;
		con.gridwidth=gw;//占据的单元格数目
		con.gridheight=gh;
		con.weightx=wx;//所占比例
		con.weighty=wy;
	}

案例代码

使用网格袋布局时,首先应在纸上设计,确定每个组件的位置和大小

package SwingDemo;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.SpringLayout.Constraints;

public class swingDemo {
	
	public static void buildConstraints(GridBagConstraints con,int gx,int gy,int gw,int gh,int wx,int wy){
		con.gridx = gx;
		con.gridy= gy;
		con.gridwidth=gw;
		con.gridheight=gh;
		con.weightx=wx;
		con.weighty=wy;
	}
	public static void main(String[] args) {
	JFrame mainFrame = new JFrame("测试界面");
	     mainFrame.setSize(290, 150);
		 JPanel panel = new JPanel();
	    GridBagLayout gbLayout =new GridBagLayout();
	    GridBagConstraints gbBagConstraints=new GridBagConstraints();
	    panel.setLayout(gbLayout);
	    
	    //添加name标签
	   JLabel nameLb = new JLabel("Name",JLabel.LEFT);
       buildConstraints(gbBagConstraints, 0, 0, 1, 1, 10, 30);
       gbBagConstraints.fill = GridBagConstraints.NONE;
       gbBagConstraints.anchor=GridBagConstraints.EAST;
	  gbLayout.setConstraints(nameLb, gbBagConstraints);
	 panel.add(nameLb);
	 
	   //添加Password标签
	   JLabel passwodbLb = new JLabel("Password",JLabel.LEFT);
       buildConstraints(gbBagConstraints, 0, 1, 1, 1, 0, 40);
       gbBagConstraints.fill = GridBagConstraints.NONE;
       gbBagConstraints.anchor=GridBagConstraints.EAST;
	  gbLayout.setConstraints(passwodbLb, gbBagConstraints);
	 panel.add(passwodbLb);
	 
	  //添加账号输入框
	 JTextField  nameTf = new JTextField();
	 buildConstraints(gbBagConstraints, 1, 0, 1, 1, 90, 0);
	    gbBagConstraints.fill = GridBagConstraints.HORIZONTAL;
	       gbBagConstraints.anchor=GridBagConstraints.EAST;
	 gbLayout.setConstraints(nameTf, gbBagConstraints);
	 panel.add(nameTf);
	 
	 //添加密码输入框
	 JPasswordField passwordPf = new JPasswordField();
	 buildConstraints(gbBagConstraints, 1, 1, 1, 1, 0, 0);
	    gbBagConstraints.fill = GridBagConstraints.HORIZONTAL;
	       gbBagConstraints.anchor=GridBagConstraints.EAST;
	 gbLayout.setConstraints(passwordPf, gbBagConstraints);
	 panel.add(passwordPf);
	 
	 //添加确认按钮
	 JButton OkBtn = new JButton("OK");
	 buildConstraints(gbBagConstraints, 0, 2, 2, 1, 0, 20);
	   
	       gbBagConstraints.anchor=GridBagConstraints.CENTER;
	 gbLayout.setConstraints(OkBtn, gbBagConstraints);
	 panel.add(OkBtn);
	 
       mainFrame.setContentPane(panel);
		 mainFrame.setVisible(true);
    
	}
}

运行结果

猜你喜欢

转载自blog.csdn.net/kuangpeng1956/article/details/83659341