第十六讲常用布局管理器
主要内容
布局管理器的作用 FlowLayout类顺序排放组件 BorderLayout边界版面布局 GridLayout网格版面布局 用面板JPanel进行界面的分块布局 |
布局管理器概述
布局管理意义
在Java中,组件在界面上的布局由布局管理器来管理。
如:
Container cc=getContentPane();
cc.setLayout(new FlowLayout());
cc.add(…);
由此可见,容器的操作处理上将界面设计分成两个步骤:
² 通过setLayout方法将布局的管理交给专门的布局管理器类来完成。
² 通过add方法将将其他组件加入其中
每个容器都有一个缺省的布局管理器,用来实现布局管理。
Container的缺省管理器是BorderLayout
布局管理器
由此可知:
² 最顶级的布局管理器是LayoutManager
² 以上列出的布局管理类都实现了该接口
² 布局管理器接口和实现接口的类都在java.awt软件包中
FlowLayout顺序排放组件
FlowLayout类概述
根据显示区域的大小,把组件按照从左到右的顺序放置,如果一行放不下,那么就转下一行。
构造方法
public FlowLayout()
public FlowLayout(int align)
public FlowLayout(int align,int hgap,int vgap)
align:排放方式,常用的有:
FlowLayout.CENTER:中心对齐(默认)
FlowLayout.LEFT:左对齐
FlowLayout.RIGHT:右对齐
FlowLayout布局示例
import java.awt.*;
import javax.swing.*;
class FlowTest extends JFrame {
FlowTest() {
super("FlowLayout");
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container cc = getContentPane();
cc.setLayout(new FlowLayout());
cc.add(new JButton("Button 1"));
cc.add(new JButton("2"));
cc.add(new JButton("Button 3"));
cc.add(new JButton("Long-Named Button 4"));
cc.add(new JButton("Button 5"));
pack();
setVisible(true);
}
public static void main(String args[]) {
new FlowTest();
}
}
运行结果:
练习:试一试带不同对齐方式参数的FlowLayout布局。(结果为后两个图示)
特点:
²改变窗口的大小,那么组件的排列方式也会跟着变化
²组件的顺序和组件的尺寸是确定的,不随窗口而改变
边界版面布局BorderLayout
BorderLayout类概述
这是Container对象默认的布局方式且全部居中。
构造方法
public BorderLayout()
public BorderLayout(int hgap,int vgap)
说明:此时需在add方法中加上确定边界位置的参数,不加参数组件会叠加在一起。
如:add(new JButton(“North”) , BorderLayout.NORTH);
常用的静态成员变量
NORTH:北边 SOUTH:南边 EAST:东边 WEST:西边 CENTER:居中 |
NORTH
WEST CENTER EAST
SOUTH |
BorderLayout布局示例
例2:改写上面程序,将五个按钮安排成边界布局。(BorderTest.java)
特点:
²改变窗口的大小,组件的排列方式保持不变
²组件的大小会随窗口而改变
²NORTH与SOUTH有确定的高度,WEST与EAST有确定的宽度
练习:试一试带间隔参数的BorderLayout布局。
GridLayout网格版面布局
GridLayout类概述
布局方式
把组件放置在类似表格的矩形网格中。
预先需设定网络的行数和列数。
构造方法
public GridLayout()
创建单行布局网格
public GridLayout(int rows, int cols)
创建指定行列的布局网格
如果给定行列数较大,网格数多于按钮数,会自动进行列调整
public GridLayout(int rows, int cols,int hgap,int vgap)
创建指定行列,并指定行列间距的布局网格(行数、列数、行间距、列间距)
GridLayout布局示例
例3:改写程序FlowTest.java,将五个按钮安排成网格布局。(GridTest.java)
试一试在组件之间加上行间距和列间距。
3*2
特点:
²改变窗口的大小,组件的排列方式保持不变,组件之间的行列间距保持不变
²所有组件的宽度和高度相同,组件的大小会随窗口的尺寸而相应改变
用面板JPanel进行界面的分块布局
JPanel概述
面板的作用
面板也是一个容器,可容放一组相关的组件。
不同的面板可采用不同的布局方式,这样有利于窗口的总体布局。
面板的构造方法:
public JPanel():创建一个FlowLayout布局的面板
public JPanel(LayoutManger layout):创建一个指定布局的面板
如:JPanel p1=new JPanel(new BorderLayout());
说明:面板的默认布局是FlowLayout,不同于Container的默认。
一个简单的面板示例
import java.awt.*;
import javax.swing.*;
class JPanelTest extends JFrame{
JButton cl,sa,ex;
JPanel p1,p2;
JTextArea t;
public JPanelTest() {
super("面板示例");
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
testInit();
Container cc=getContentPane();
cc.setLayout(new FlowLayout());
cc.add(p1);
cc.add(p2);
this.setSize(350,150);
this.setVisible(true);
}
void testInit(){
cl = new JButton("Clear");
sa = new JButton("Save");
ex = new JButton("Exit");
t=new JTextArea(5,20);
t.setLineWrap(true);
p1=new JPanel(new GridLayout(3,1,5,5));
p2=new JPanel();
p1.add(cl); p1.add(sa);p1.add(ex);
p2.add(new JScrollPane(t));
}
public static voidmain(String[] args) {
new JPanelTest();
}
}
练习:修改以上程序,使得程序运行界面如下图:(下图文本框为6*30)
界面布局的分析和设计
一、对如下图示窗口,分析其布局情况
界面布局设计分析:
² 界面组成
² 面板在包容器中的布局情况
² 各面板的布局情况
二、计算器窗口界面设计(不考虑事件)
界面布局设计分析:
² 界面组成
² 面板在包容器中的布局情况
² 各面板的布局情况
附程序清单:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class MyButtons {
String[] keys={"7","8","9","/","4","5","6",
"*","1","2","3","-","0",".","=","+","Clear"};
JButton[] keyb = new JButton[keys.length];
MyButtons(JTextField t){
for( int i = 0; i < keys.length; i++ ) {
keyb[i]=new JButton(keys[i]);
}
}
}
class Calculator extends JFrame {
JTextField t;
MyButtons keyButton;
JPanel p;
public Calculator() {
super("Java计算器");
setDefaultCloseOperation(EXIT_ON_CLOSE );
calInit();
Container cc = getContentPane();
cc.setLayout( new BorderLayout() );
cc.add(t, "North" );
cc.add(p, "Center" );
cc.add(keyButton.keyb[keyButton.keyb.length-1], "South" );
this.setLocation(300,200);
this.pack();
this.setResizable(false);
this.setVisible(true);
}
void calInit(){
t=new JTextField("0.0");
t.setEditable(false);
t.setHorizontalAlignment(JTextField.RIGHT);
keyButton=new MyButtons(t);
p = new JPanel();
p.setLayout(new GridLayout(4,4,4,4));
for( int i = 0;i<keyButton.keyb.length-1; i++ ){
p.add(keyButton.keyb[i]);
}
}
public static void main( String[] args ) {
new Calculator();
}
}
*绝对定位
定义组件的在当前屏幕(窗口)中的位置。两个步骤:
² 放置组件的容器布局设为空:
容器面板.setLayout(null);
² 用setBounds方法设定各组件的位置和尺寸
组件名.setBounds(x,y,width,height)
import java.awt.*;
import javax.swing.*;
class TestSetBounds extends JFrame {
JButton red= new JButton("red");
JButton green = new JButton("green");
JButton blue = new JButton("blue");
JTextArea t=new JTextArea("try",4,15);
public TestSetBounds() {
super("绝对定位示例");
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c=getContentPane();
c.setLayout(null);
this.setBounds(400,300,300,200);
red.setBounds(30,25,80,25);
green.setBounds(30,75,80,25);
blue.setBounds(30,125,80,25);
t.setLineWrap(true);
JScrollPane s=new JScrollPane(t);
s.setBounds(150,25,100,125);
c.add(red);
c.add(green);
c.add(blue);
c.add(s);
this.setVisible(true);
}
public static void main(String[] args) {
new TestSetBounds();
}
}
特点:
² 可指定组件确定的显示位置和尺寸,不随窗口的大小而变化
² 不需要用到布局管理器类,但需预先进行组件排版
² 适用于固定尺寸的窗口布局