目录
AWT继承关系
window
Panel
布局管理器
FlowLayout(流式布局管理器)
BorderLayout(边界布局管理器)
GridLayout(网格布局管理器)
GridBagLayout(网格包布局管理器)
CardLayout(卡片布局管理器)
AWT继承关系
AWT提供了一系列用于图形界面的组件,如窗口、按钮、文本框、对话框等等。接下看一下他们之间的继承关系:
window
window类是不依赖于其他容器而独立存在容器,它有两个子类,分别是Frame类和Dialog类。对于Frame类用于创建一个具有标题栏的框架窗口,作为程序的主界面;而Dialog用于创建一个对话框,用于实现与用户的信息交互。
Panel
Panel是一个容器,他不能单独存在,必须存在于其他容器中,比如Window类或者其子类,Panel对象代表了一个长方形的区域,在这个区域中可以收纳其他组件,在程序中通常用Panel来实现一些特殊的布局。
布局管理器
由于组件不能单独存在,必须放在容器当中,为了更好的布置组件的位置和尺寸,所以要设置布局管理器进行布局。在Java中,有五种布局管理器,分别为Flowlayout , Boderlayout , Gridlayout, Gridbaglayout 和 cardlayout.
FlowLayout(流式布局管理器)
布局规则:
Constructor | 描述 | |
---|---|---|
1 | FlowLayout() | 构造一个新的 |
2 | FlowLayout(int align) | 构造新的 |
3 | FlowLayout(int align, int hgap, int vgap) | 创建一个新的流程布局管理器,具有指示的对齐方式和指示的水平和垂直间距。 |
参数:
align - 对齐值,值一般是FlowLayout.LEFT , FlowLayout.RIGHT , FlowLayout.CENTER , FlowLayout.LEADING ,或FlowLayout.TRAILING 。
hgap - 组件之间和组件之间的水平间隙和 Container的边界
vgap - 组件之间和组件之间的垂直间隙以及 Container的边框
实例:
import java.awt.*;
public class test1 {public static void main(String[] args) {
// 创建窗口体final Frame f=new Frame("Flowlayout");
// 设置布局管理器为FlowLayout,所有组件左对齐,水平距离20,垂直距离为30f.setLayout(new FlowLayout(FlowLayout.LEFT,20,30));
// 设置窗口大小f.setSize(220,300);
// 设置显示位置f.setLocation(300,200);
// 添加按钮f.add(new Button("第1个按钮"));f.add(new Button("第2个按钮"));f.add(new Button("第3个按钮"));f.add(new Button("第4个按钮"));f.add(new Button("第5个按钮"));f.add(new Button("第6个按钮"));
// 设置窗口可见f.setVisible(true);}
}
运行结果:
分析:
所有组件有规律的进行排列,但是灵活性差了一点,还有你会发现,这个页面不能退出,那是没有编写退出事件,请看下一文,详细说明如何编写退出事件:
AWT事件处理
BorderLayout(边界布局管理器)
布局规则:分为五个板块位置,如下图:
实例:
import java.awt.*;
public class test2 {public static void main(String[] args) {
// 创建窗口体,进行命名final Frame f=new Frame("Flowlayout");
// 设置布局管理器,窗口大小,窗口的位置f.setLayout(new BorderLayout());f.setSize(300,300);f.setLocation(300,200);f.setVisible(true);Button bu1=new Button("东方");Button bu2=new Button("西方");Button bu3=new Button("南方");Button bu4=new Button("北方");Button bu5=new Button("中方");f.add(bu1,BorderLayout.EAST);f.add(bu2,BorderLayout.WEST);f.add(bu3,BorderLayout.SOUTH);f.add(bu4,BorderLayout.NORTH);f.add(bu5,BorderLayout.CENTER);}
}
运行结果:
分析:
如果不指定添加到那个区域,组件会默认添加到center区域,并且每个区域只能添加一个组件,一个区域添加多个组件时,后添加的组件会覆盖原来的组件。
GridLayout(网格布局管理器)
布局规则:
用横竖线把容器分为N行M列大小相同的网格,然后依次像FlowLayout一样添加组件,并且每个网格放置一个组件。
Constructor | 描述 | |
---|---|---|
1 | GridLayout() | 在单个行中创建一个每个组件的默认值为一列的网格布局。 |
2 | GridLayout(int rows, int cols) | 创建具有指定行数和列数的网格布局。 |
3 | GridLayout(int rows, int cols, int hgap, int vgap) | 创建具有指定行数和列数的网格布局。 |
rows和cols一个但不是两个可以为零,这意味着可以将任意数量的对象放置在行或列中。
所有GridLayout构造函数都GridLayout这一个。
参数
rows - 值为0,表示任意数量的行
cols - 列,值为零表示任意数量的列
hgap - 水平间隙
vgap - 垂直间隙
实例:
import java.awt.Button;
import java.awt.Frame;
import java.awt.GridLayout;
//网格布局管理器
public class test3 {public static void main(String[] args) {Frame f=new Frame();
// 设置窗体为3*3网格f.setLayout(new GridLayout(3,3));f.setSize(300,300);f.setLocation(400,300);for(int i=0;i<=9;i++) {Button btn=new Button("btn"+i);f.add(btn);}f.setVisible(true);}
}
运行结果:
分析:
组件的相对位置不会随着区域缩放而改变,但是组件的大小会随着缩放会改变
GridBagLayout(网格包布局管理器)
最为复杂,最灵活的布局管理器。
布局规则:
与GridLayout相似,不同在于组件可以跨多个网格。
可以垂直,水平或沿其基准对齐组件,而不需要组件的大小相同。 每个GridBagLayout对象维护一个动态的,矩形的单元格网格,每个组件占据一个或多个单元格,称为其显示区域 。 由GridBagLayout管理的每个组件与一个GridBagConstraints的实例相关联。 constraints对象指定组件的显示区域在网格上的位置以及组件在其显示区域内的位置。 除了其约束对象 外, GridBagLayout还考虑每个组件的最小和首选大小,以确定组件的大小。
容器的整体方向取决于集装箱的ComponentOrientation属性。 对于水平从左到右的方向,网格坐标(0,0)位于容器的左上角,其中x向右增加,y向下增加。 对于水平从右到左的方向,网格坐标(0,0)位于容器的右上角,其中x向左增加,y向下增加。 为了有效使用网格包布局,必须定制一个或多个GridBagConstraints了与它的组件相关联的对象。
GridBagLayout常用属性
1.GridBagConstraints.gridx , GridBagConstraints.gridy
指定包含组件显示区域的前角的单元格,其中网格原点的单元格地址gridx = 0 ,gridy = 0 。 对于水平从左到右的布局,组件的前角是其左上角。 对于水平从右到左的布局,组件的前角是其右上角。 使用GridBagConstraints.RELATIVE (默认值)来指定在添加该组件之前添加到容器中的组件,立即将组件放置在(沿x轴为gridx或y轴为gridy )之后。
2.GridBagConstraints.gridwidth , GridBagConstraints.gridheight
指定组件显示区域中一行中的单元格数( gridwidth )或列( gridheight )。 默认值为1.使用GridBagConstraints.REMAINDER指定组件的显示区域将从gridx到行中的最后一个单元格( gridwidth )或从gridy到列的最后一个单元格( gridheight )。 使用GridBagConstraints.RELATIVE指定组件的显示区域将从gridx到其行中最后一个单元格的下一个( gridwidth或从gridy到其列中最后一个单元格的gridheight )( gridheight )。
3.GridBagConstraints.fill
当组件的显示区域大于组件的请求大小时使用,以确定是否(以及如何)调整组件的大小。 可能的值为
GridBagConstraints.NONE (默认值), GridBagConstraints.HORIZONTAL (使组件宽度足以水平填充其显示区域,但不要更改其高度), GridBagConstraints.VERTICAL (使组件足够高以垂直填充其显示区域,但不要更改其宽度)和GridBagConstraints.BOTH (使组件完全填充其显示区域)。
4.GridBagConstraints.weightx, GridBagCOnstraints.weighty
设置组件占领容器中多余的水平方向和竖直方向空白比例(也称为权重)。
5.GridBagConstraints.ipadx , GridBagConstraints.ipady
在布局中指定组件的内部填充,添加到组件的最小大小的多少。 组件的宽度至少为其最小宽度加上ipadx像素。 类似地,组件的高度将至少为最小高度加上ipady像素。
6.GridBagConstraints.insets
指定组件的外部填充,组件与其显示区域边缘之间的最小空间量。
7.GridBagConstraints.anchor
指定组件在其显示区域中的位置。 有三种可能的值:绝对值,方向相对值和基线相对方向相对值相对于容器的ComponentOrientation属性进行解释,绝对值不是。 基线相对值相对于基线计算。 有效值为: Absolute, relative and baseline values as described above
实例:
package daya7;
import java.awt.*;
// 网格包布局
class Layout extends Frame{public Layout(String title) {
// 创建布局管理器,采用该布局GridBagLayout layout=new GridBagLayout();GridBagConstraints c=new GridBagConstraints();this.setLayout(layout);
// 设置组件横竖可拉伸距离,c.fill =GridBagConstraints.BOTH;
// 设置横向,竖向权重为1c.weightx=1;c.weighty=1;this.addComponent("btn1",layout,c);this.addComponent("btn2",layout,c);this.addComponent("btn3",layout,c);
// 添加组件是本行最后一个组件c.gridwidth=GridBagConstraints.REMAINDER;this.addComponent("btn4", layout, c);c.weightx=0;c.weighty=0;this.addComponent("btn5", layout, c);
// 设置组件跨一个网格(默认值)c.gridwidth=1;this.addComponent("btn6", layout, c);
// 添加组件是本行最后一个组件c.gridwidth=GridBagConstraints.REMAINDER;this.addComponent("btn7", layout, c);
// 设置组件纵向跨两个网格,横向跨一个网格,横向竖向权重为2c.gridheight=2;c.gridwidth=1;c.weightx=2;c.weighty=2;this.addComponent("btn8", layout, c);c.gridwidth=GridBagConstraints.REMAINDER;c.gridheight=1;this.addComponent("btn9", layout, c);this.addComponent("btn10", layout, c);this.setTitle(title);this.pack();this.setVisible(true); }
// 添加组件的方法private void addComponent(String name, GridBagLayout layout, GridBagConstraints c) {// TODO Auto-generated method stubButton bt=new Button(name);
// 设置GridBagConstraints和按钮的关联layout.setConstraints(bt, c);
// 增加按钮this.add(bt);}
}
public class test4_a{public static void main(String[] args) {new Layout("GridBagLayout");}
}
运行结果:
CardLayout(卡片布局管理器)
布局规则:
把界面看作一系列卡片,便于切换界面,一次只能显示一个界面卡片
实例:
package daya8;
import java.awt.*;
import java.awt.event.*;
//定义Cardlayout继承Frame类,实现ActionListener接口
class Cardlayout extends Frame implements ActionListener{
// 定义Panel画板放置卡片Panel cardPanel =new Panel();
// 定义Panel面板放置按钮Panel controlpaPanel=new Panel();Button nextButton,preButton;
// 定义卡片布局对象CardLayout cardLayout=new CardLayout();
// 定义构造方法,设置卡片布局管理器的属性public Cardlayout() {setSize(400,400);setVisible(true);
// 为窗口添加关闭事件监听器this.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {Cardlayout.this.dispose();}});cardPanel.setLayout(cardLayout);
// 在cardPanel面板对象添加3个文本标签cardPanel.add(new Label("第一个界面",Label.CENTER));cardPanel.add(new Label("第二个界面",Label.CENTER));cardPanel.add(new Label("第三个界面",Label.CENTER));
// 创建两个按钮对象nextButton=new Button("下一张");preButton =new Button("上一张");
// 为按钮对象注册监听器nextButton.addActionListener(this);preButton.addActionListener(this);
// 将按钮添加到controlpaPanelcontrolpaPanel.add(nextButton);controlpaPanel.add(preButton);
// 将cardPanel面板放置在窗口边界布局的中间,窗口默认为边界布局this.add(cardPanel,BorderLayout.CENTER);
// 画板放置在窗口边界布局的南区this.add(controlpaPanel,BorderLayout.SOUTH);}@Override
// 下面的代码实现了按钮的监听触发,并对触发事件做出相应的处理public void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubif(e.getSource()==nextButton) {cardLayout.next(cardPanel);}if(e.getSource()==preButton) {cardLayout.previous(cardPanel);}}
}
public class test2 {public static void main(String[] args) {System.out.println("a");Cardlayout cardlayout=new Cardlayout();}
}
运行结果:
不使用布局管理器
当一个容器创建的时候,都会有个默认的布局管理器,window,Frame 和Dialog默认管理器是BorderLayout,Panel默认管理器是FlowLayout。如果不希望通过布局管理器进行布局,可以利用容器的setLayout()方法将布局管理器进行取消。
布局规则:
调用组件setSize和setLocation(或者setBounds方法)为组件进行定位。
实例:
import java.awt.*;
public class test6 {public static void main(String[] args) {Frame f=new Frame("不用布局管理器");f.setLayout(null);f.setSize(400,400);f.setLocation(300,300);Button btn1=new Button("one");Button btn2=new Button("two");
// 设置按钮左上角的x,y坐标以及按钮的长宽btn1.setBounds(20, 30, 100, 40);btn2.setBounds(140, 100, 50, 20);f.add(btn1);f.add(btn2);f.setVisible(true);}
}
运行结果:
AWT事件处理
实现关闭功能
package daya8;
import java.awt.*;
import java.awt.event.*;
//监听事件
public class test3 {public static void main(String[] args) {Frame f=new Frame("my Window");f.setSize(400,300);f.setLocation(300,400);f.setVisible(true);
// 为窗口组件注册监听器MyWindowListener mw=new MyWindowListener();f.addWindowListener(mw); }
}
class MyWindowListener implements WindowListener{@Overridepublic void windowOpened(WindowEvent e) {// TODO Auto-generated method stub}@Overridepublic void windowClosing(WindowEvent e) {// TODO Auto-generated method stubWindow window=e.getWindow();window.setVisible(false);window.dispose();}@Overridepublic void windowClosed(WindowEvent e) {// TODO Auto-generated method stub
// System.out.println("111111111111");}@Override
// 窗口初始化设置public void windowIconified(WindowEvent e) {// TODO Auto-generated method stub}
// 窗口已确认@Overridepublic void windowDeiconified(WindowEvent e) {// TODO Auto-generated method stub}
// 窗口已激活@Overridepublic void windowActivated(WindowEvent e) {// TODO Auto-generated method stub}
// 窗口已停用@Overridepublic void windowDeactivated(WindowEvent e) {// TODO Auto-generated method stub}}
事件适配器
package daya8;
import java.awt.*;
import java.awt.event.*;
//事件适配器
public class test4 {public static void main(String[] args) {Frame f=new Frame("my Window");f.setSize(400,300);f.setLocation(300,400);f.setVisible(true);f.addWindowListener(new MyWindowListenera());}}
class MyWindowListenera extends WindowAdapter{public void windowClosing(WindowEvent e) {
// 获取组件Window window =(Window) e.getComponent();
// 处理window.dispose();}
}
用匿名内部类实行事件处理
package daya8;
import java.awt.*;
import java.awt.event.*;
//事件适配器
public class test4 {public static void main(String[] args) {Frame f=new Frame("my Window");f.setSize(400,300);f.setLocation(300,400);f.setVisible(true);f.addWindowListener(new MyWindowListenera());}}
class MyWindowListenera extends WindowAdapter{public void windowClosing(WindowEvent e) {
// 获取组件Window window =(Window) e.getComponent();
// 处理window.dispose();}
}