布局的概念:
布局是指组件在容器中的排列方式,主要有:
1.流式布局FlowLayout
以行为单位依此排列各组件,一行排不下时另起一行
JPanel的默认布局
该布局适用于组件个数较少的情况。
缺点:当用户对由FlowLayout布局管理的区域进行缩放时,布局会发生变化
构造方法:
- FlowLayout();
- FlowLayout(int align); //align一般取值有:CENTER、LEFT、RIGHT
- FlowLayout(int alig,int hgap,int vgap); //hgap和vgap指定组件与容器起始边界以及组件间的水平和垂直间距,默认值为5个像素
例如:FlowLayout layout = new FlowLayout(FlowLayout.LEFT,10,10);
FlowLayout布局的使用:
创建FlowLayout布局对象:
- FlowLayout fl = new FlowLayout();
创建容器对象:
- JPanel panel = new JPanel();
设置容器对象的布局或使用默认布局:
- panel.setLayout(fl);
向容器中添加组件对象(设组件对象已创建):
- panel.add(组件对象);
2.边界布局BorderLayout
按照东、西、南、北、中5个方位排列各组件
顶层容器JFrame、JApplet、JDialog、JWindow的默认布局
缺点:当加入的组件超过5个时,就必须使用容器的嵌套或其它布局
优点:当容器缩放时,组件相应的位置不变化,但大小改变
构造方法:
- BorderLayout();
- BorderLayout(int hgap,int vgap); //hgap和vgap指定组件间的水平和垂直间距,默认值为0个像素
BorderLayout布局的使用
创建BorderLayout布局对象:
- BorderLayout bl = new BorderLayout();
创建容器对象:
- JPanel panel = new JPanel();
设置容器对象的布局或使用默认布局:
- panel.setLayout(bl);
向容器中添加组件对象(设组件对象已创建):
- panel.add(组件对象,方位);
//方位的取值为:
BorderLayout.EAST 或“East”
BorderLayout.WEST 或“West”
BorderLayout.SOUTH 或“South”
BorderLayout.NORTH 或“North”
BorderLayout.CENTER 或“Center”(默认)
代码:
import javax.swing.*;
import java.awt.*;
public class BorderDemo extends JFrame{
JButton bn,bs,bw,be,bc;
public BorderDemo(){
super("BorderLayout Demo");
Container c=getContentPane();
c.setLayout(new BorderLayout());
bn=new JButton("北");
bs=new JButton("南");
be=new JButton("东");
bw=new JButton("西");
bc=new JButton("中");
c.add("North",bn);
c.add(bs,"South");
c.add(BorderLayout.EAST,be);
c.add(bw,BorderLayout.WEST);
c.add("Center",bc);
setSize(400,400);
setVisible(true);
}
public static void main(String args[]){
new BorderDemo();
}
}
3.网格布局GridLayout
按照二维网格以相同大小依此排列各组件
该布局适用于组件个数较多的情况
优点:组件的相应位置不随区域的缩放而改变,只是组件的大小改变。
构造方法:
- GridLayout(); //一行、每个组件一列
- GridLayout(int rows,int cols); //行列数
- GridLayout(rows,cols,int hgap,int vgap); //行行、列列的间距,默认值为0个像素 布局的使用
创建GridLayout布局对象:
- GridLayout gl = new GridLayout(2,2);
创建容器对象:
- JPanel panel = new JPanel();
设置容器对象的布局或使用默认布局:
- panel.setLayout(gl);
向容器中添加组件对象(设组件对象已创建)
- panel.add(组件对象);
4.卡片布局CardLayout
以一叠卡片的形式依此排列个组件
构造方法:
- CardLayout();
- CardLayout(int hgap,int vgap); //组件与容器间距,默认值为0个像素
- 创建CardLayout cl = new CardLayout();
创建容器对象:
- JPanel panel = new JPanel();
设置容器对象的布局或使用默认布局:
- panel.setLayout(cl);
向容器中添加组件对象(设组件对象已创建):
- panel.add(组件对象,“名称”);
显示组件:
- cl.show(panel,“名称”);
- cl.first(panel);
- cl.last(panel);
- cl.next(panel);
- cl.previous(panel);
代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class CardDemo extends JFrame implements ActionListener{
CardLayout card=new CardLayout();
Container c=getContentPane();
public CardDemo(){
super("CardLayout Demo");
JButton cb[]=new JButton[6];
c.setLayout(card);
for(int i=1;i<=5;i++){
cb[i]=new JButton("卡片号为:"+i);
cb[i].addActionListener(this);
c.add(String.valueOf(i),cb[i]); //String.valueOf(i),该方法返回一个int参数的字符串表示形式
}
card.show(c,String.valueOf(4));
setSize(400,400);
setVisible(true);
}
public void actionPerformed(ActionEvent e){
card.next(c);
}
public static void main(String args[]){
new CardDemo();
}
}
5.盒式布局BoxLayout
以一行或一列的方式依此排列各组件
容器Box的默认布局为且只能为BoxLayout
javax.swing.Box 类的使用
创建Box对象:
- Box b1 = Box.createHorizontalBox();
创建一个从左到右显示其组件的Box
- Box b2 = Box.createVerticalBox();
创建一个从上到下显示其组件的Box
向盒子中添加组件对象(设已创建):
- b1.add(组件对象);
向盒子中添加必要的透明组件
添加Glue:Glue用来对组件进行挤压,产生左对齐、右对齐或两端对齐的效果
- b1.add(Box.createHorizontalGlue());
- b2.add(Box.createVerticalGlue());
添加Strut:Strut用来加入组件间的间距
- b1.add(Box.createHorizontalStruct(5));
- b2.add(Box.createVerticalStruct(5));
添加RigidArea:RigidArea用来设置组件的间距和高度(宽度和间距)
- Dimension d = new Dimension(50,80);
- b1.add(Box.createRigidArea(d));
- b2.add(Box.createRigidArea(d));
6.网格包布局GridBagLayout
从网格出发来布局组件,但一个组件在横向和纵向上都可以占据多个网格,灵活但比较复杂
使用GridBagConstraints指定组件在布局时的有关约束值
属性(11个):
- gridx,gridy - 位置
- gridwidth,gridheight - 占据网格数
- anchor - 方位
- fill - 充满方式
javax.awt.GridBagConstraints.HORIZONTAL
javax.awt.GridBagConstraints.VERTICAL
javax.awt.GridBagConstraints.BOTH
创建对象:
- GridBagConstraints gbc1,gbc2;
- gbc1 = new GridBagConstraints();
- gbc2 = new GridBagConstraints(,);
布局的使用
- GridBagLayout gbl = new GridBagLayout();
- JPanel panel = new JPanel();
- panel.setLayout(gbl);
- GridBagConstraints gbc = new GridBagConstraints();
,//设置 - Jbutton button = new JButton(“Button”);
- panel.add(button,gbc);
一般布局步骤:
- 画出组件布局草图
- 确定每个组件应占据的网格
- 分别在x和y方向上为网格标上序号
- 组件的gridx,gridy,gridwidth,gridheight据填充和对齐要求设置fill和anchor值
- 须保持默认大小的组件的weightx和weighty值设为0,其余的设为100
- 看是否需要设置填塞值insert和ipadx、ipady
- 编写代码,运行程序,观察结果,必要时进行修改
7.空布局(不使用布局)null
不使用任何布局管理器,一般不使用该方式
创建容器对象:
- JPanel panel = new JPanel();
设置容器对象的布局为null:
- panel.setLayout(null);
设置组件在容器中的位置:
- 组件对象.setBounds(x,y,width,height);
向容器中添加组件对象(设已创建):
- panel.add(组件对象);
注意:对于一些复杂的情况,往往需要使用容器的嵌套,各容器可使用不同的布局。当容器的尺寸改变时,布局管理器会自动调整组件的排列
代码:
import java.awt.*;
import javax.swing.*;
public class NullLayout extends JFrame{
JButton b1=new JButton("按钮1");
JButton b2=new JButton("按钮2");
JButton b3=new JButton("按钮3");
JLabel lb=new JLabel("看我们的摆放位置,很随意!!");
public NullLayout(){
super("nullLayout Demo");
Container c=getContentPane();
c.setLayout(null);
c.add(lb);
lb.setBounds(300,190,200,30);
c.add(b1);
b1.setBounds(20,30,90,30);
c.add(b2);
b2.setBounds(100,70,90,30);
c.add(b3);
b3.setBounds(150,120,90,50);
setSize(540,480);
setVisible(true);
}
public static void main(String args[]){
new NullLayout();
}
}