–Window
Container(容器)
?排列其中包容的构件
–定位布局策略 set/getLayout() ? 包容其他基本构件 – 增加构件: add( ) – 删除构件: remove( )
? 控制是否显示容器及其中组件 –setVisible(true/false)
容器的组件布局
?布局管理器(layout manager) –用于控制组件在容器中的布局
–负责确定组件在容器中的位置和大小。
–调用容器的setLayout(布局管理器对象) 方法,为容器指定某种布局。
–当容器需要定位组件和确定组件大小时,就会给布局管理器对象发消息,让它完成该项工作。 ?直接管理组件
–调用容器的 setLayout(null) 方法,关闭布局管理器。 –调用每一个组件的setLocation()方法决定组件位置。 –调用每一个组件的setSize()方法决定其大小。
布局管理器种类
在Java的GUI界面设计中,布局控制是通过为容器设置布 局编辑器来实现的。Java.awt包中共定义了五种布局编辑 类,每一个布局编辑类对应一种布局策略:
?FlowLayout :组件在一行中按加入的先后顺序从左至右水平排
列,排满后折行,每行中的组件都居中排列。 ?BorderLayout:把容器空间划分为北、南、西、东、中五个区,
每加入一个组件都应说明把这个组件加在那个区 域中。
?CardLayout:每一个组件作为一个卡片,容器仅显示多个卡片中 的某一个 ?GridLayout:以行和列的网格形式安排组件 ?GridBagLayout:更复杂、功能更强的网格布局
确定容器布局
?缺省的布局管理器
–Window、Frame、Dialog — BorderLayout: 缺省的窗口容器 的管理器 –Panel、Applet — FlowLayout:
缺省的Panel 布局管理器 ?选择布局管理器的方法
– 建立布局管理器类的对象
– 利用容器的 setLayout 为容器指定布局( 即指定一个布局管理器的对象)
确定容器布局
?改变缺省布局管理器的方法;
例:BorderLayout B=new BorderLayout(); C1.setLayout(B); or C1.setLayout(new BorderLayout());
例: 将myFrame布局设定为FlowLayout类型 myFrame.setLayout(new FlowLayout()); Frame
?Frame(String title)
构造一个新的不可见的frame
?隐含的布局管理器是:BorderLayout ?setLayout(…) 设置新的布局管理器。 ?add(Component comp)
在容器上增加一个组件(在容器为不可见的状态时加)。 ?void setSize(int width, int height) 设置组件大小 ?setVisible(true) 设置组件可见 Frame — Panel
Frame fm1 = new Frame(\ fm1.setSize(400,350);
fm1.setBackground(Color.gray); fm1.setLayout(null);
Panel pn1 = new Panel(); pn1.setSize(100,100);
pn1.setBackground(Color.red); pn1.setLocation(0,50); fm1.add(pn1); …
fm1.setVisible(true); FlowLayout布局管理器 ?构造方法: –FlowLayout() ;
–FlowLayout(int align, int hgap, int vgap); align :对齐方式:LEFT CENTER RIGHT hgap :组件水平间距 (像素) vgap :组件垂直间距
?无参数的构造方法创建的FlowLayout对象,其对齐方式为CENTER居中方式,组件间的横纵间距都为5个像素。 FlowLayout布局管理器
Frame f = new Frame(\
f.setSize(400,300); //不起作用 f.setBackground(Color.gray);
f.setLayout(new FlowLayout(FlowLayout.LEFT,10,20)); b1 = new Button(\ b2 = new Button(\ b3 = new Button(\ f.add(b1); f.add(b2); f.add(b3);
f.setVisible(true);
f.pack(); //询问布局管理器窗体大小
BorderLayout 布局管理器
?setLayout(new BorderLayout() ) ?add(b1,BorderLayout.NORTH);
?当容器大小改变,组件相对位置不会改变。 BorderLayout 布局管理器
f = new Frame(\ f.setSize(200,200);
b1 = new Button(\ …
b5 = new Button(\ f.add(b1,BorderLayout.NORTH); f.add(b2,BorderLayout.SOUTH); f.add(b3,BorderLayout.WEST); f.add(b4,BorderLayout.EAST); f.add(b5,BorderLayout.CENTER); f.setVisible(true); Border-Panel
class MyFrame extends Frame{ MyFrame(){
Button b1 = new Button(\ 1 \ Button b2 = new Button(\ 2 \ Button b3 = new Button(\ 3 \
Button b4 = new Button(\ 4 \ Panel p = new Panel(); p.add(b1);
p.add(b2);//FlowLayout布局 add(p,BorderLayout.NORTH); add(b3,BorderLayout.WEST); add(b4,BorderLayout.CENTER); pack();
setVisible(true);} } GridLayout布局管理器
?创建GridLayout对象作为布局编辑器,指定划分网格的 行数和列数(网格大小一样)。
setLayout(new GridLayout(行数, 列数));
setLayout(new GridLayout(行数, 列数,行间隔,列间隔)); ?调用容器的方法add()将组件加入容器,组件填入容器 的顺序将按照第一行第一个、第一行第二个、……
?每个网格中都必须填入组件,如果希望某个网格为空白,可以为它加入一个空的标签: add (new Label()); GridLayout布局管理器
f = new Frame(\
f.setLayout(new GridLayout(2,3)); f.setSize(200,100);
f.setBackground(Color.gray); b1 = new Button(\ …
b6 = new Button(\ f.add(b1); …
f.setVisible(true);
GridLayout布局例
Frame fm = new Frame()
fm.setLayout(new FlowLayout()); tf = new TextField(22); fm.add(tf);
Panel p1 = new Panel();
p1.setLayout(new GridLayout(4,3)); p1.add(…);
Panel p2 = new Panel();
p2.setLayout(new GridLayout(4,3)); p2.add(…);
fm. add(p1); fm. add(p2); GridBagLayout布局管理器
?每个GridBagLayout对象维护一个动态矩形网格, ?每个组件可占据一个或多个单元作为它的显示区域。
?每一个组件都与一个GridBagConstraints类的实例相连,以指定在显示区域中如何摆放,并可确定大小。 ?步骤:
–setLayout(new GridBagLayout());
–GridBagConstraints gbc = new GridBagConstraints(); –gbc.gridx = 0; …(属性赋值) –add(button1 , gbc )
GridBagLayout布局管理器
设置GridBagConstraints类实例属性值:
?gridx gridy 组件显示区域的左上角单元格坐标 ?gridwidth gridheight 指定显示区域行、列单元数 ?RELATIVE 紧挨着前一个组件摆放
?fill 当显示区域大于组件时如何扩充组件:
HORIZONTAL 水平充满 VERTICAL 垂直充满 BOTH 全部填充 NONE 不调整(隐含) ?ipadx ipady 指定组件间最小间隔
?anchor 当显示区域大于组件时如何摆放组件(对齐方式) CENTER(隐含), NORTH, EAST, SOUTH, WEST, SOUTHEAST, NORTHEAST, SOUTHWEST, NORTHWEST. CardLayout布局管理器
?使用CardLayout的容器表面可以容纳多个组件,将每
一个组件视为一张卡片,同一时刻只能显示一个组件。 ?setLayout(new CardLayout())
?CardLayout方法(按序指定组件)
–first(Container parent) 显示第一个版面的内容 –last(Container parent) 显示最后一个版面的内容 –previous(Container parent) 显示前一个版面的内容 –next(Container parent) 显示下一个版面的内容 ?CardLayout方法(按名显示组件)
–addLayoutComponent(String name, Component c) –show(Container parent, String name) 利用AWT创建自己的GUI
?GUI外观设计
–设计标准构件层次关系:构件层次结构关系树 –设置容器布局策略:setLayout() –生成标准构件
–向容器中添加组成构件:add()方法
?构件事件处理
?例:AWTComponent.java
Java1.0.2的事件处理
?使用单一的java.awt.Event类来接受所有类型的事件;
?使用action(), handleEvent( )以及其他的一些事件处理方法(如鼠标事件、键盘事件、焦点事件)来进行相应事件的事件处理。
?缺点:造成长if分支语句组,不利于面向对象的编程 Java1.1 对事件处理的改进 ?引入java.awt.event包 ?更加面向对象,易于理解
?定义了事件的“发生者”和“监听者”对象
按钮事件、文本事件、选择事件、调整事件、 鼠标事件、键盘事件等
?事件以类层次来表达,取代了1.0.2中的单一的 类,并可以自定义事件类型 事件及处理机制
?用户操作GUI组件时会引发各种事件。 ?事件 :描述“发生了什么事情”的对象。
系统根据用户的操作构造出相应事件类的对象。 ?事件源:事件的产生地,即用户交互的各种GUI组件。 ?事件处理程序:是一个方法,它接收一个事件对象、
分析它、并完成对该事件的处理。
?每个事件有一个相应的监听者接口,它规定了能够接收(并处理)该类事件的方法的规范。 ?监听者:实现了监听者接口的类,它包含有事件处理 程序。
?编程人员要为事件源指定监听者对象(即指定处理某种事件的事件处理程序)。 事件处理机制
?组件(事件发生者)触发一个相应类型的事 件
?此事件由相应类型的Listener(事件监听者) 接收并处理 事件及处理机制 几个有用的概念
?事件 - 在java.awt.event包中定义了若干类型 的事件类,描述发生了什么的对象
?监听者接口 - 特定类型的Listener接口,用于 监听特定类型的事件
?监听者类 - 是实现了某种监听者接口的类,由编程者定义 ?事件监听者 - 是某个监听者类的对象,由编 程者使用new创建