一、AWT
▶AWT (Abstract Window Toolkit) 包括了很多类和接口,用于Java Application 的 GUI(Graphics User Interface 图形用户界面)编程。
▶GUI 的各种元素(如:窗口、按钮、文本框等)由Java类来实现。
▶使用 AWT 所涉及的类一般在 java.awt 包及其子包中。
▶Container 和Component 是AWT中的两个核心类
二、Component & Container
▶Java 的图形界面最基本组成部分是 Component,Component 类及其子类的对象用来描述以图形化的方式显示在屏幕上并能与用户进行交互的GUI元素,例如,一个按钮,一个标签等。
▶一般的Component对象不能独立的显示出来,必须“放在”某一Containner对象中才可以显示出来。
▶Containner 是Component的子类。Container子类对象也可以“容纳”别的Component对象。
▶Container 对象可使用方法add (...)向其中添加其他Component对象。
▶Containner 是 Component的子类,因此Container对象也可以被当做Component对象添加到其他的Container对象中。
▶有两种常用的Container:
•Window:其对象表示自由停泊的顶级窗口。
•Panel:其对象可容纳其他 Component 对象,但不能独立存在,必须被添加到其他Container中(如Window或Applet)
三、Frame
▶Frame 是 Window 的子类, 由 Frame 或其子类创建的对象为一个窗体。
▶Frame的常用构造方法:
•Frame()
•Frame(String s) 创建标题栏为字符串s的窗口
例1:TestFrame.java
import java.awt.*;
public class TestFrame {
public static void main(String[] args) {
Frame f = new Frame("My first test");
f.setLocation(300,300);
f.setSize(170,100);
f.setBackground(Color.red);
f.setResizable(false);
f.setVisible(true);
}
}
例2:TestMultiFrame.java
import java.awt.*;
public class TestMultiFrame {
public static void main(String[] args) {
MyFrame f1 = new MyFrame(100,100,200,200,Color.blue);
MyFrame f2 = new MyFrame(300,100,200,200,Color.yellow);
MyFrame f3 = new MyFrame(100,300,200,200,Color.GREEN);
MyFrame f4 = new MyFrame(300,300,200,200,Color.MAGENTA);
}
}
class MyFrame extends Frame {//优先。使用继承可以拥有自己的成员变量
static int id = 0;
MyFrame(int x, int y, int w, int h, Color color) {
super("MyFrame"+(++id));
setBackground(color);
setLayout(null);
setBounds(x,y,w,h);
setVisible(true);
}
}
四、Panel
▶Panel 对象可以看成可以容纳 Component 的空间
▶Panel 对象可以拥有自己的布局管理器
▶Panel 类拥有从其父类继承来的setBounds、SetLayout等方法。
▶Panel 的构造方法为:
Panel()使用默认的FlowLayout类布局管理器初始化
Panel(LayoutManager layout)使用指定的布局管理器初始化
例1、TestPanel.java
import java.awt.*;
public class TestPanel {
public static void main(String[] args) {
Frame f = new Frame("Java Frame with Panel");
Panel p = new Panel(null);
f.setLayout(null);
f.setBounds(300,300,500,500);//相对整个屏幕
f.setBackground(new Color(0,0,102));
p.setBounds(50,50,400,400);//相对于被放入的地方
p.setBackground(new Color(204,204,255));
f.add(p);//把Panel放入Frame
f.setVisible(true);
}
}
例2、TestMultiPanel.java
import java.awt.*;
public class TestMultiPanel {
public static void main(String[] args) {
new MyFrame2("MyFrame with Panel",300,300,400,300);
}
}
class MyFrame2 extends Frame {
private Panel p1,p2,p3,p4;
MyFrame2(String s, int x, int y, int w, int h) {
super(s);
setLayout(null);
p1 = new Panel(null);
p2 = new Panel(null);
p3 = new Panel(null);
p4 = new Panel(null);
p1.setBounds(0, 0, w/2, h/2);
p2.setBounds(0, h/2, w/2, h/2);
p3.setBounds(w/2, 0, w/2, h/2);
p4.setBounds(w/2, h/2, w/2, h/2);
p1.setBackground(Color.blue);
p2.setBackground(Color.green);
p3.setBackground(Color.yellow);
p4.setBackground(Color.magenta);
add(p1);
add(p2);
add(p3);
add(p4);
setBounds(x,y,w,h);
setVisible(true);
}
}
五、布局管理器
▶Java语言中,提供了布局管理器类的对象可以管理。
☛管理Component 在 Container 中的布局,不必直接设置 Component 的大小。
☛每个 Container 都有一个布局管理器对象,当容器需要对某个组件进行定位或判断其大小尺寸时,就会调用其对应的布局管理器,调用Container 的 setLayout 方法改变其布局管理器对象。
▶AWT提供了5种布局管理器类:
•FlowLayout
•BorderLayout
•GridLayout
•CardLayout
•GridBagLayout
1、FlowLayout 布局管理器
◆FlowLayout 是Panel 类的默认布局管理器。
◇FlowLayout 布局管理器对组件逐行定位,行内从左到右,一行排满后换行。
◇不改变组件的大小,按组件原有尺寸显示组件,可设置不同的组件间距,行距以及对齐方式。
◆FlowLayout 布局管理器默认的对齐方式是居中。
◆FlowLayout 的构造方法
◇new FlowLayout (FlowLayout.RIGHT, 20, 40); //右对齐,组件之间水平间距20个像素,垂直间距40个像素
◆ new FlowLayout (FlowLayout.LEFT);//左对齐,水平和垂直间距为缺省值(5)
◆new FlowLayout( );// 使用缺省的居中对齐方式,水平和垂直间距为缺省值(5)
例1:TestFlowLayout1.java
import java.awt.*;
public class TestFlowLayout1 {
public static void main(String[] args) {
Frame f = new Frame("FlowLayout");
Button button1 = new Button("OK");
Button button2 = new Button("Open");
Button button3 = new Button("Close");
//f.setLayout(new FlowLayout());
f.setLayout(new FlowLayout(FlowLayout.LEFT));
f.add(button1);
f.add(button2);
f.add(button3);
f.setVisible(true);
f.setSize(100,100);
}
}
例2:TestFlowLayout2.java
import java.awt.*;
public class TestFlowLayout2 {
public static void main(String[] args) {
Frame f = new Frame("Java Frame");
FlowLayout l = new FlowLayout(FlowLayout.CENTER,20,40);
f.setLayout(l);
f.setLocation(300,400);
f.setSize(300,200);
f.setBackground(new Color(204,204,255));
for(int i = 0; i <= 7; i++) {
f.add(new Button("BUTTON"));
}
f.setVisible(true);
}
}
2、BorderLayout 布局管理器
BorderLayout 型布局容器尺寸缩放原则:
▶北,南两个区域在水平方向缩放
▶东、西两个区域在垂直方向缩放
▶中部可在两个方向上缩放
例1、 TestBorderLayout.java
import java.awt.*;
public class TestBorderLayout {
public static void main(String[] args) {
Frame f;
f = new Frame("BorderLayout");
Button bn = new Button("BN");
Button bs = new Button("BS");
Button bw = new Button("BW");
Button be = new Button("BE");
Button bc = new Button("BC");
f.add(bn, BorderLayout.NORTH);
f.add(bs, BorderLayout.SOUTH);
f.add(bw, BorderLayout.WEST);
f.add(be, BorderLayout.EAST);
f.add(bc, BorderLayout.CENTER);
/* 也可以使用下述语句
f.add(bn,"North");
f.add(bs,"South");
f.add(bw,"West");
f.add(be,"East");
f.add(bc,"Center");
*/
f.setSize(200,200);
f.setVisible(true);
}
}
3、GridLayout 布局管理器
▶GridLayout 型布局管理器将空间划分成规则的矩形网格,每个单元格区域大小相等。组件被添加到每个单元格中,先从左到右添满一行后换行,再从上到下。
▶在GridLayout 构造方法中指定分隔的行数和列数:
如:GridLayout(3,4)
import java.awt.*;
public class TestGridLayout {
public static void main(String[] args) {
Frame f;
f = new Frame("GridLayout");
Button b1 = new Button("B1");
Button b2 = new Button("B2");
Button b3 = new Button("B3");
Button b4 = new Button("B4");
Button b5 = new Button("B5");
Button b6 = new Button("B6");
f.setLayout(new GridLayout(3,2));
f.add(b1);
f.add(b2);
f.add(b3);
f.add(b4);
f.add(b5);
f.add(b6);
f.pack();
f.setSize(200,200);
f.setVisible(true);
}
}
4、布局管理器总结
▶ Frame 是一个顶级窗口,Frame的缺省布局管理器为BorderLayout。
▶ Panel无法单独显示,必须添加到某个容器中。
▶ Panel 的缺省布局管理器为FlowLayout。
▶当把Panel 作为一个组件添加到某个容器中后,该 Panel 依然可以有自己的布局管理器。
▶使用布局管理器时,布局管理器负责各个组件的大小和位置,因此用户无法再这种情况下设置组件大小和位置属性,如果试图使用Java语言提供的 setLocation ( ), setSize ( ), setBounds ( ) 等方法,则都会被布局管理器覆盖。
▶如果用户确实需要亲自设置组件大小或位置,则应取消该容器的布局管理器,方法为:setLayout (null);