布局管理器
读者会发现,如果使用坐标定位法(空布局),在一个比较复杂的界面上定位每个控件的坐标是一个非常麻烦的工作,而且在界面大小发生改变时,控件的绝对位置也不会随之发生改变。那么如果我们想让用户界面上的组件可以按照不同的方式进行排列怎么办?例如:可以依序水平排列,或者按网格方式进行排列等,其实每种排列方案都是指组件的一种“布局”,要管理这些布局,就需要本节学习的布局管理器。
管理布局的类由java.awt包来提供,布局管理器是一组实现java.awt.LayoutManager接口的类,由这些类自动定位组件。一般使用布局管理器定义容器,如果容器使用了某种布局管理器后,那么放在其上的控件就按照相应的规则排列。我们接下来就介绍几种常用的布局管理器:流式布局(FlowLayout)、边界布局(BorderLayout)、网格布局(GridLayout)。如图1所示。
如上图所示:如果在一个容器中压入控件(该示例的控件用一组JButton代表),我们发现流式布局会将控件放在第一行,第一行满了自动放置在第二行,依次类推;而边界布局会把控件分布在容器的东、南、西、北、中的五个区域;最后网格布局会把容器中的控件按n行m列均匀分布。
注意:
1)一旦使用任何布局,那么控件的坐标定位将失效。
2)如果在使用流式布局的容器中压入JTextField控件,那么这个JTextField的构造方法请
3)使用传int参数的构造方法。
java.awt.FlowLayout
流布局用于安排有方向的控件,这非常类似于段落中的文本行。如表1所示,为FlowLayout类的构造方法。
注意:
JPanel的无参构造方法默认就是流式布局。
【示例1】流式布局
packagecn.sxt.views.testlayout;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JPanel;
publicclassFlowLayoutDemoextendsJFrame {
privateJPanelpnlMain;
privateJButtonbtn1;
privateJButtonbtn2;
privateJButtonbtn3;
privateJButtonbtn4;
privateJButtonbtn5;
publicFlowLayoutDemo() {
//该处代码也可以写成:pnlMain = new JPanel(new FlowLayout());
pnlMain=newJPanel();
btn1=newJButton("按钮1");
btn2=newJButton("按钮2");
btn3=newJButton("按钮3");
btn4=newJButton("按钮4");
btn5=newJButton("按钮5");
init();
}
privatevoidinit() {
//设置窗口属性
this.setTitle("测试流式布局");
this.setSize(300, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//将控件添加到容器上
pnlMain.add(btn1);
pnlMain.add(btn2);
pnlMain.add(btn3);
pnlMain.add(btn4);
pnlMain.add(btn5);
//将容器添加到窗口上
this.add(pnlMain);
this.setVisible(true);
}
/**创建流式布局窗口*/
publicstaticvoidmain(String[ ]args) {
newFlowLayoutDemo();
}
}
执行结果如图所示:
java.awt. BorderLayout
布置容器的边界布局,它可以对容器上的控件进行安排,并调整其大小,使其符合下列五个区域:南、北、东、西和中间区域。如表3所示,为BorderLayout类的构造方法。
注意:
边界布局最多将容器分成5个区间,但是可以少,比如只有北、中、南,或是只有西、中、东,或是按照需求具体划分
【示例2】边界布局
packagecn.sxt.views.testlayout;
importjava.awt.BorderLayout;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JPanel;
publicclassBorderLayoutDemoextendsJFrame {
privateJPanelpnlMain;
privateJButtonbtnN;
privateJButtonbtnC;
privateJButtonbtnS;
privateJButtonbtnW;
privateJButtonbtnE;
publicBorderLayoutDemo() {
//将容器的布局设置为边界布局
pnlMain=newJPanel(newBorderLayout());
btnN=newJButton("按钮-北");
btnC=newJButton("按钮-中");
btnS=newJButton("按钮-南");
btnW=newJButton("按钮-西");
btnE=newJButton("按钮-东");
init();
}
privatevoidinit() {
//设置窗口属性
this.setTitle("测试边界布局");
this.setSize(300, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
/*
*注意在使用边界布局的容器时,压入控件要以第2参数说明控件放在哪个位置;
*否则,如果没有第2参数,默认在中间区域
*/
pnlMain.add(btnN,BorderLayout.NORTH);
pnlMain.add(btnC,BorderLayout.CENTER);
pnlMain.add(btnS,BorderLayout.SOUTH);
pnlMain.add(btnW,BorderLayout.WEST);
pnlMain.add(btnE,BorderLayout.EAST);
//将容器添加到窗口上
this.add(pnlMain);
this.setVisible(true);
}
/**创建边界布局窗口*/
publicstaticvoidmain(String[ ]args) {
newBorderLayoutDemo();
}
}
执行结果如图所示:
java.awt. GridLayout
网格布局它以矩形网格形式对容器的控件进行布置。容器被分成大小相等的矩形,一个矩形中放置一个控件。 如表5所示,为GridLayout类的构造方法。
注意:
使用网格布局时,如果控件的数量过多或过少时,网格布局会自动调整,但是行数不会变化,如:设置一个2行3列的网格,如果压入控件为7个,那么自动变为2行4列。
如果在一个容器中要压入12个按钮,按3行4列排列,如示例3所示。
【示例3】网格布局
packagecn.sxt.views.testlayout;
importjava.awt.GridLayout;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JPanel;
publicclassGridLayoutDemoextendsJFrame {
privateJPanelpnlMain;
privateJButton[ ]btnS;
publicGridLayoutDemo() {
//将容器的布局设置为网格布局,指定布局为3行4列
pnlMain=newJPanel(newGridLayout(3, 4));
btnS=newJButton[12];
for(inti= 0;i
btnS[i] =newJButton("按钮"+(i+1));
}
init();
}
//设置窗口属性
this.setTitle("测试网格布局");
this.setSize(400, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//将控件添加到容器上
for(JButtonbtn:btnS) {
pnlMain.add(btn);
}
//将容器添加到窗口上
this.add(pnlMain);
this.setVisible(true);
}
/**创建网格布局窗口*/
publicstaticvoidmain(String[ ]args) {
newGridLayoutDemo();
}
}
执行结果如图所示:
「全栈Java笔记」是一部能帮大家从零到一成长为全栈Java工程师系列笔记。笔者江湖人称 Mr. G,10年Java研发经验,曾在神州数码、航天院某所研发中心从事软件设计及研发工作,从小白逐渐做到工程师、高级工程师、架构师。精通Java平台软件开发,精通JAVAEE,熟悉各种流行开发框架。
笔记包含从浅入深的六大部分:
A-Java入门阶段
B-数据库从入门到精通
C-手刃移动前端和Web前端
D-J2EE从了解到实战
E-Java高级框架精解
F-Linux和Hadoop