JavaSwing布局管理器
引⾔
在使⽤ Swing 向容器添加组件时,需要考虑组件的位置和⼤⼩。如果不使⽤布局管理器,则需要先在纸上画好各个组件的位置并计算组件间的距离,再向容器中添加。这样虽然能够灵活控制组件的位置,实现却⾮常⿇烦。
为了加快开发速度,Java 提供了⼀些布局管理器,它们可以将组件进⾏统⼀管理,这样开发⼈员就不需要考虑组件是否会重叠等问题。本⽂绍 Swing 提供的 8 种布局类型,所有布局都实现 LayoutManager 接⼝。
⼀、绝对布局
1.1 边框布局管理器(BorderLayout)
BorderLayout(边框布局管理器)是 Window、JFrame 和 JDialog 的默认布局管理器。边框布局管理器将窗⼝分为 5 个区域:North、South、East、West 和 Center。其中,North 表⽰北,将占据⾯板的上⽅;Soufe 表⽰南,将占据⾯板的下⽅;East表⽰东,将占据⾯板的右侧;West 表⽰西,将占据⾯板的左侧;中间区域 Center 是在东、南、西、北都填满后剩下的区域,如图 所⽰:
提⽰:边框布局管理器并不要求所有区域都必须有组件,如果四周的区域(North、South、East 和 West 区域)没有组件,则由 Center 区域去补充。
如果单个区域中添加的不只⼀个组件,那么后来添加的组件将覆盖原来的组件,所以,区域中只显⽰最后添加的⼀个组件。
1.2 BorderLayout 布局管理器的构造⽅法
BorderLayout()
创建⼀个 Border 布局,组件之间没有间隙。
BorderLayout(int hgap,int vgap)
创建⼀个 Border 布局,其中 hgap 表⽰组件之间的横向间隔;vgap 表⽰组件之间的纵向间隔,单位
是像素。
1.3 ⽰例
使⽤ BorderLayout 将窗⼝分割为 5 个区域,并在每个区域添加⼀个标签按钮。实现代码如下:
import javax.swing.*;
import java.awt.*;
public class BorderLayoutDemo {
public static void main(String[] agrs){
JFrame frame=new JFrame("BorderLayoutDemo");//创建Frame窗⼝
frame.setSize(400,200);
frame.setLayout(new BorderLayout());//为Frame窗⼝设置布局为BorderLayout
JButton button1=new JButton ("上");
JButton button2=new JButton("左");
JButton button3=new JButton("中");
JButton button4=new JButton("右");
JButton button5=new JButton("下");
frame.add(button1,BorderLayout.NORTH);
frame.add(button2,BorderLayout.WEST);
frame.add(button3,BorderLayout.CENTER);
frame.add(button4,BorderLayout.EAST);
frame.add(button5,BorderLayout.SOUTH);
frame.setBounds(300,200,600,300);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
运⾏效果如下:
⼆、流式布局管理器(FlowLayout)
2.1 FlowLayout
javaswing实现购买FlowLayout(流式布局管理器)是 JPanel 和 JApplet 的默认布局管理器。FlowLayout 会将组件按照从从左到右、上到下的放置规律逐⾏进⾏定位。与其他布局管理器不同的是,FlowLayout 布局管理器不限制它所管理组件的⼤⼩,⽽是允许它们有⾃⼰的最佳⼤⼩。
2.2 FlowLayout 布局管理器的构造⽅法
FlowLayout():创建⼀个布局管理器,使⽤默认的居中对齐⽅式和默认5像素的⽔平和垂直间隔。
FlowLayout(int align):创建⼀个布局管理器,使⽤默认5像素的⽔平和垂直间隔。其中,align 表⽰组件的对齐⽅式,对齐的值必须是 FlowLayout.LEFT、Flo wLayout.RIGHT 和 FlowLayout.CENTER,指定组件在这⼀⾏的位置是居左对齐、居右对齐或居中对齐。
FlowLayout(int align,int hgap,int vgap):创建⼀个布局管理器,其中 align 表⽰组件的对齐⽅式;hgap 表⽰组件之间的横向间隔;vgap 表⽰组件之间的纵向间隔,单位是像素。
2.3 ⽰例
使⽤ FlowLayout 类对窗⼝进⾏布局,向容器内添加 9 个按钮,并设置横向和纵向的间隔都为 20 像素。具体实现代码如下:
import javax.swing.*;
import java.awt.*;
public class FlowLayoutDemo {
public static void main(String[] agrs){
JFrame jFrame=new JFrame("FlowLayoutDemo");//创建Frame窗⼝
JPanel jPanel=new JPanel();//创建⾯板
JButton btn1=new JButton("1");//创建按钮
JButton btn2=new JButton("2");
JButton btn3=new JButton("3");
JButton btn4=new JButton("4");
JButton btn5=new JButton("5");
JButton btn6=new JButton("6");
JButton btn7=new JButton("7");
JButton btn8=new JButton("8");
JButton btn9=new JButton("9");
jPanel.add(btn1);//⾯板中添加按钮
jPanel.add(btn2);
jPanel.add(btn3);
jPanel.add(btn4);
jPanel.add(btn5);
jPanel.add(btn6);
jPanel.add(btn7);
jPanel.add(btn8);
jPanel.add(btn9);
//向JPanel添加FlowLayout布局管理器,将组件间的横向和纵向间隙都设置为20像素
jPanel.setLayout(new FlowLayout(FlowLayout.LEADING,20,20));
jPanel.ay);//设置背景⾊
jFrame.add(jPanel);//添加⾯板到容器
jFrame.setBounds(300,200,300,150);//设置容器的⼤⼩
jFrame.setVisible(true);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
上述程序向 JPanel ⾯板中添加了 9 个按钮,并使⽤ FlowLayout 布局管理器使 9 个按钮间的横向和纵
向间隙都为 20 像素。此时这些按钮将在容器上按照从上到下、从左到右的顺序排列,如果⼀⾏剩余空间不⾜容纳组件将会换⾏显⽰,最终运⾏结果如图 所⽰:
三、卡⽚布局管理器(CardLayout)
3.1 CardLayout
CardLayout(卡⽚布局管理器)能够帮助⽤户实现多个成员共享同⼀个显⽰空间,并且⼀次只显⽰⼀个容器组件的内容。
CardLayout 布局管理器将容器分成许多层,每层的显⽰空间占据整个容器的⼤⼩,但是每层只允许放置⼀个组件。
3.2 CardLayout 的构造⽅法
CardLayout():构造⼀个新布局,默认间隔为0。
CardLayout(int hgap,int vgap):创建布局管理器,并指定组件间的⽔平间隔(hgap)和垂直间隔(vgap)。
3.3 ⽰例
使⽤ CardLayout 类对容器内的两个⾯板进⾏布局。其中第⼀个⾯板上包括三个按钮,第⼆个⾯板上包括三个⽂本框。最后调⽤CardLayout 类的 show() ⽅法显⽰指定⾯板的内容,代码如下:
import javax.swing.*;
import java.awt.*;
public class CardLayoutDemo {
public static void main(String[] agrs){
JFrame frame=new JFrame("CardLayoutDemo");//创建Frame窗⼝
JPanel p1=new JPanel();//⾯板1
JPanel p2=new JPanel();//⾯板2
JPanel cards=new JPanel(new CardLayout());//卡⽚式布局的⾯板
p1.add(new JButton("登录按钮"));
p1.add(new JButton("注册按钮"));
p1.add(new JButton("回密码按钮"));
p2.add(new JTextField("⽤户名⽂本框",20));
p2.add(new JTextField("密码⽂本框",20));
p2.add(new JTextField("验证码⽂本框",20));
cards.add(p1,"card1");//向卡⽚式布局⾯板中添加⾯板1
cards.add(p2,"card2");//向卡⽚式布局⾯板中添加⾯板2
CardLayout cl=(CardLayout)(Layout());
cl.show(cards,"card1");//调⽤show()⽅法显⽰⾯板2
frame.add(cards);
frame.setBounds(300,200,400,200);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
上述代码创建了⼀个卡⽚式布局的⾯板 cards,该⾯板包含两个⼤⼩相同的⼦⾯板 p1 和 p2。需要注
意的是,在将 p1 和 p2 添加到cards ⾯板中时使⽤了含有两个参数的 add() ⽅法,该⽅法的第⼆个参数⽤来标识⼦⾯板。当需要显⽰某⼀个⾯板时,只需要调⽤卡⽚式布局管理器的 show() ⽅法,并在参数中指定⼦⾯板所对应的字符串即可,这⾥显⽰的是 p1 ⾯板,运⾏效果如图 所⽰:
如果将“cl.show(cards,“card1”)”语句中的 card1 换成 card2,将显⽰ p2 ⾯板的内容,此时运⾏结果如图 所⽰:
四、⽹格布局管理器(GridLayout)
4.1 GridLayout
GridLayout(⽹格布局管理器)为组件的放置位置提供了更⼤的灵活性。它将区域分割成⾏数(rows)和列数(columns)的⽹格状布局,组件按照由左⾄右、由上⽽下的次序排列填充到各个单元格中。
提⽰:GridLayout 布局管理器总是忽略组件的最佳⼤⼩,⽽是根据提供的⾏和列进⾏平分。该布局管理的所有单元格的宽度和⾼度都是⼀样的。
4.2 GridLayout 的构造⽅法
GridLayout(int rows,int cols):创建⼀个指定⾏(rows)和列(cols)的⽹格布局。布局中所有组件的⼤⼩⼀样,组件之间没有间隔。
GridLayout(int rows,int cols,int hgap,int vgap):创建⼀个指定⾏(rows)和列(cols)的⽹格布局,并且可以指定组件之间横向(hgap)和纵向(vgap)的间隔,单位是像素。
4.3 ⽰例
使⽤ GridLayout 类的⽹格布局设计⼀个简单计算器。代码的实现如下:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论