java.awt包
java.awt包
提供了基本的java程序GUI设计工具。
Component/MenuComponent
Container
LayoutManager
组件(Component)
Java的图形用户界面的最基本组成部分是组件,组件是一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象,例如一个按钮,一个标签等。
组件不能独立地显示出来,必须将组件放在一定的容器中才可以显示出来
容 器(Container)
容器(Container)实际上是Component的子类,因此容器类对象本身也是一个组件,具有组件的所有性质,另外还具有容纳其它组件和容器的功能。
容器类对象可使用方法add()添加组件
两种主要的容器类型
Window: 可自由停泊的顶级窗口
Panel:可作为容器容纳其它组件,但不能独立存在,必须被添加到其它容器中(如Window 或 Applet)
组件定位
Java组件在容器中的位置和尺寸由布局管理器决定
如要人工控制组件在容器中的大小位置,可取消布局管理器,然后使用Component类的下述成员方法:
setLocation()
setSize()
setBounds()
Frame类
Frame类是抽象类Window的子类
Frame对象显示效果是一个“窗口”,带有标题和尺寸重置角标
默认初始化为不可见的,可使用setVisible(true)方法使之变为可见
默认的布局管理器是BorderLayout
可使用setLayout()方法改变其默认布局管理器
Frame类继承层次
java.lang.Object
|
+----java.awt.Component
|
+----java.awt.Container
|
+----java.awt.Window
|
+----java.awt.Frame
Frame 应用举例(1001)
import java.awt.*;
public class TestFrame {
public static void main( String args[]) {
Frame f = new Frame("My First Test");
f.setSize( 170,100);
f.setBackground( Color.blue);
f.setVisible( true);
}
}
Panel类
提供容纳组件的空间
可以采用和所在容器不同的布局管理器
Panel类的继承层次
java.lang.Object
|
+----java.awt.Component
|
+----java.awt.Container
|
+----java.awt.Panel
FrameWithPanel应用举例
import java.awt.*;
public class TestFrameWithPanel {
public static void main(String args[]) {
Frame f = new Frame("MyTest Frame");
Panel pan = new Panel();
f.setSize(200,200);
f.setBackground(Color.blue);
f.setLayout(null); // 取消布局管理器
pan.setSize(100,100);
pan.setBackground(Color.green);
f.add(pan);
f.setVisible(true);
}
}
布局管理器
为了使我们生成的图形用户界面具有良好的平台无关性,Java语言中,提供了布局管理器这个工具来管理组件在容器中的布局,而不使用直接设置组件位置和大小的方式。
每个容器都有一个布局管理器,当容器需要对某个组件进行定位或判断其大小尺寸时,就会调用其对应的布局管理器。
容器布局 (Container Layouts)
FlowLayout
BorderLayout
GridLayout
CardLayout
GridBagLayout
默认布局管理器
FlowLayout布局管理器
FlowLayout是Panel类的默认布局管理器
FlowLayout布局对组件逐行定位,行内从左到右,一行排满后换行
默认对齐方式为居中对齐
不改变组件的大小,按组件原有尺寸显示组件 可在构造方法中设置不同的组件间距、行距及对齐方式
FlowLayout 举例(1003)
import java.awt.*;
public class TestFlowLayout {
public static void main(String args[]) {
Frame f = new Frame("Flow Layout");
Button button1 = new Button("Ok");
Button button2 = new Button("Open");
Button button3 = new Button("Close");
f.setLayout(new FlowLayout());
f.add(button1);
f.add(button2);
f.add(button3);
f.setSize(100,100);
f.setVisible(true);
}
}
FlowLayout 的构造方法
new FlowLayout(FlowLayout.RIGHT,20,40);
右对齐,组件之间水平间距20个像素,竖直间距40个像素;
new FlowLayout(FlowLayout.LEFT);
左对齐,水平和竖直间距为缺省值:5;
new FlowLayout();
使用缺省的居中对齐方式,水平和竖直间距为缺省值:5;
BorderLayout 布局管理器
BorderLayout是Frame类的默认布局管理器
BorderLayout将整个容器的布局划分成东、西、南、北、中五个区域,组件只能被添加到指定的区域
如不指定组件的加入部位,则默认加入到Center区域
每个区域只能加入一个组件,如加入多个,则先前加入的组件会被遗弃
BorderLayout型布局容器尺寸缩放原则
北、南两个区域只能在水平方向缩放(宽度可调整)
东、西两个区域只能在垂直方向缩放(高度可调整)
中部可在两个方向上缩放
BorderLayout举例1004
import java.awt.*;
public class TestBorderLayout {
public static void main(String args[]) {
Frame f;
f = new Frame("Border Layout");
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, "North");
f.add(bs, "South");
f.add(bw, "West");
f.add(be, "East");
f.add(bc, "Center");
f.setSize(200,200);
f.setVisible(true);
}
}
GridLayout 布局管理器
GridLayout型布局管理器将布局划分成规则的矩形网格,每个单元格区域大小相等.
组件被添加到每个单元格中,先从左到右添满一行后换行,再从上到下.
在GridLayout构造方法中指定分割的行数和列数.
new GridLayout(3,4);
GridLayout举例(1005)
import java.awt.*;
public class TestGridLayout {
public static void main(String args[]) {
Frame f = new Frame("GridLayout Example");
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.setVisible(true);
}
}
CardLayout 布局管理器
CardLayout布局管理器能够帮助用户处理两个以至更多的成员共享同一显示空间,就好象一叠卡片摞在一起。
注意:在一张卡片中只能显示一个组件,因此可以使用容器嵌套方法显示多个组件。
GridBagLayout 布局管理器
AWT中最灵活、最复杂的布局管理器,各组件所占空间可以不相同且灵活规定,参见中文参考书;
容器的嵌套使用举例
import java.awt.*;
public class NestedContainer {
public static void main(String args[]) {
Frame f = new Frame("NestedContainer");
Button b0 = new Button("display Area");
Panel p = new Panel();
p.setLayout(new GridLayout(2,2));
Button b1 = new Button("1");
Button b2 = new Button("2");
Button b3 = new Button("3");
Button b4 = new Button("4");
p.add(b1); p.add(b2);
p.add(b3); p.add(b4);
f.add(b0, "North");
f.add(p, "Center");
f.pack();
f.setVisible(true);
}
}
布局管理器总结(1)
Frame
Frame是一个顶级窗口。
Frame的缺省布局管理器为BorderLayout。
Panel
Panel无法单独显示,必须添加到某个容器中。
Panel的缺省布局管理器为FlowLayout。
当把Panel作为一个组件添加到某个容器中后,该Panel仍然可以有自己的布局管理器。因此,可以利用Panel使得BorderLayout中某个区域显示多个组件。
布局管理器总结(2)
在程序中安排组件的位置和大小时,应注意:
容器中的布局管理器负责各个组件的大小和位置,因此用户无法在这种情况下设置组件的这些属性。如果试图使用Java语言提供的setLocation(),setSize(),setBounds()等方法,则都会被布局管理器覆盖。
如果用户确实需要亲自设置组件大小或位置,则应取消该容器的布局管理器,方法为:
setLayout(null);
AWT 绘图
可以在任何Java组件上绘图(通常Canvas和Panel组件更适合用于绘图)
每个Java组件都有一个public void paint(Graphics g)方法专门用于绘图目的,每次重画该组件时都自动调用paint方法。
每个Java组件都有一个Graphics类型的属性,该属性(对象)真正完成在相应组件上的绘图功能。
Graphics类中实现了许多绘图方法:
-- 绘制边框(非填充图形)
-- 填充特定区域
-- 绘制其它形状图形
AWT 绘图举例
import java.awt.*;
public class AWTDrawing {
private Frame f = new Frame(" Hello Out There!");
private Panel p = new Panel();
public void launchFrame() {
f.add(p);
f.setSize( 170,170);
f.setBackground( Color.blue);
f.setVisible( true);
p.setForeground(Color.red);
Graphics g = p.getGraphics();
g.drawArc(30,40,50,60,70,80);
g.fillArc(30,40,50,60,70,80);
}
public static void main( String args[]) {
AWTDrawing guiWindow = new AWTDrawing();
guiWindow.launchFrame();
}
}
import java.awt.*;
class SubPanel extends Panel{
public void paint(Graphics g){
g.drawString("this is a drawing test!",20,20);
g.drawLine(30,60,100,120);
g.draw3DRect(60,50,70,30,false);
}
}
public class AWTDrawing2 {
private Frame f = new Frame(" Hello Out There!");
private SubPanel p = new SubPanel();
public void launchFrame() {
f.add(p);
f.setSize(170,170);
f.setBackground( new Color(89,145,145));
f.setVisible( true);
}
public static void main( String args[]) {
AWTDrawing2 guiWindow = new AWTDrawing2();
guiWindow.launchFrame();
}
}
提供了基本的java程序GUI设计工具。
Component/MenuComponent
Container
LayoutManager
组件(Component)
Java的图形用户界面的最基本组成部分是组件,组件是一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象,例如一个按钮,一个标签等。
组件不能独立地显示出来,必须将组件放在一定的容器中才可以显示出来
容 器(Container)
容器(Container)实际上是Component的子类,因此容器类对象本身也是一个组件,具有组件的所有性质,另外还具有容纳其它组件和容器的功能。
容器类对象可使用方法add()添加组件
两种主要的容器类型
Window: 可自由停泊的顶级窗口
Panel:可作为容器容纳其它组件,但不能独立存在,必须被添加到其它容器中(如Window 或 Applet)
组件定位
Java组件在容器中的位置和尺寸由布局管理器决定
如要人工控制组件在容器中的大小位置,可取消布局管理器,然后使用Component类的下述成员方法:
setLocation()
setSize()
setBounds()
Frame类
Frame类是抽象类Window的子类
Frame对象显示效果是一个“窗口”,带有标题和尺寸重置角标
默认初始化为不可见的,可使用setVisible(true)方法使之变为可见
默认的布局管理器是BorderLayout
可使用setLayout()方法改变其默认布局管理器
Frame类继承层次
java.lang.Object
|
+----java.awt.Component
|
+----java.awt.Container
|
+----java.awt.Window
|
+----java.awt.Frame
Frame 应用举例(1001)
import java.awt.*;
public class TestFrame {
public static void main( String args[]) {
Frame f = new Frame("My First Test");
f.setSize( 170,100);
f.setBackground( Color.blue);
f.setVisible( true);
}
}
Panel类
提供容纳组件的空间
可以采用和所在容器不同的布局管理器
Panel类的继承层次
java.lang.Object
|
+----java.awt.Component
|
+----java.awt.Container
|
+----java.awt.Panel
FrameWithPanel应用举例
import java.awt.*;
public class TestFrameWithPanel {
public static void main(String args[]) {
Frame f = new Frame("MyTest Frame");
Panel pan = new Panel();
f.setSize(200,200);
f.setBackground(Color.blue);
f.setLayout(null); // 取消布局管理器
pan.setSize(100,100);
pan.setBackground(Color.green);
f.add(pan);
f.setVisible(true);
}
}
布局管理器
为了使我们生成的图形用户界面具有良好的平台无关性,Java语言中,提供了布局管理器这个工具来管理组件在容器中的布局,而不使用直接设置组件位置和大小的方式。
每个容器都有一个布局管理器,当容器需要对某个组件进行定位或判断其大小尺寸时,就会调用其对应的布局管理器。
容器布局 (Container Layouts)
FlowLayout
BorderLayout
GridLayout
CardLayout
GridBagLayout
默认布局管理器
FlowLayout布局管理器
FlowLayout是Panel类的默认布局管理器
FlowLayout布局对组件逐行定位,行内从左到右,一行排满后换行
默认对齐方式为居中对齐
不改变组件的大小,按组件原有尺寸显示组件 可在构造方法中设置不同的组件间距、行距及对齐方式
FlowLayout 举例(1003)
import java.awt.*;
public class TestFlowLayout {
public static void main(String args[]) {
Frame f = new Frame("Flow Layout");
Button button1 = new Button("Ok");
Button button2 = new Button("Open");
Button button3 = new Button("Close");
f.setLayout(new FlowLayout());
f.add(button1);
f.add(button2);
f.add(button3);
f.setSize(100,100);
f.setVisible(true);
}
}
FlowLayout 的构造方法
new FlowLayout(FlowLayout.RIGHT,20,40);
右对齐,组件之间水平间距20个像素,竖直间距40个像素;
new FlowLayout(FlowLayout.LEFT);
左对齐,水平和竖直间距为缺省值:5;
new FlowLayout();
使用缺省的居中对齐方式,水平和竖直间距为缺省值:5;
BorderLayout 布局管理器
BorderLayout是Frame类的默认布局管理器
BorderLayout将整个容器的布局划分成东、西、南、北、中五个区域,组件只能被添加到指定的区域
如不指定组件的加入部位,则默认加入到Center区域
每个区域只能加入一个组件,如加入多个,则先前加入的组件会被遗弃
BorderLayout型布局容器尺寸缩放原则
北、南两个区域只能在水平方向缩放(宽度可调整)
东、西两个区域只能在垂直方向缩放(高度可调整)
中部可在两个方向上缩放
BorderLayout举例1004
import java.awt.*;
public class TestBorderLayout {
public static void main(String args[]) {
Frame f;
f = new Frame("Border Layout");
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, "North");
f.add(bs, "South");
f.add(bw, "West");
f.add(be, "East");
f.add(bc, "Center");
f.setSize(200,200);
f.setVisible(true);
}
}
GridLayout 布局管理器
GridLayout型布局管理器将布局划分成规则的矩形网格,每个单元格区域大小相等.
组件被添加到每个单元格中,先从左到右添满一行后换行,再从上到下.
在GridLayout构造方法中指定分割的行数和列数.
new GridLayout(3,4);
GridLayout举例(1005)
import java.awt.*;
public class TestGridLayout {
public static void main(String args[]) {
Frame f = new Frame("GridLayout Example");
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.setVisible(true);
}
}
CardLayout 布局管理器
CardLayout布局管理器能够帮助用户处理两个以至更多的成员共享同一显示空间,就好象一叠卡片摞在一起。
注意:在一张卡片中只能显示一个组件,因此可以使用容器嵌套方法显示多个组件。
GridBagLayout 布局管理器
AWT中最灵活、最复杂的布局管理器,各组件所占空间可以不相同且灵活规定,参见中文参考书;
容器的嵌套使用举例
import java.awt.*;
public class NestedContainer {
public static void main(String args[]) {
Frame f = new Frame("NestedContainer");
Button b0 = new Button("display Area");
Panel p = new Panel();
p.setLayout(new GridLayout(2,2));
Button b1 = new Button("1");
Button b2 = new Button("2");
Button b3 = new Button("3");
Button b4 = new Button("4");
p.add(b1); p.add(b2);
p.add(b3); p.add(b4);
f.add(b0, "North");
f.add(p, "Center");
f.pack();
f.setVisible(true);
}
}
布局管理器总结(1)
Frame
Frame是一个顶级窗口。
Frame的缺省布局管理器为BorderLayout。
Panel
Panel无法单独显示,必须添加到某个容器中。
Panel的缺省布局管理器为FlowLayout。
当把Panel作为一个组件添加到某个容器中后,该Panel仍然可以有自己的布局管理器。因此,可以利用Panel使得BorderLayout中某个区域显示多个组件。
布局管理器总结(2)
在程序中安排组件的位置和大小时,应注意:
容器中的布局管理器负责各个组件的大小和位置,因此用户无法在这种情况下设置组件的这些属性。如果试图使用Java语言提供的setLocation(),setSize(),setBounds()等方法,则都会被布局管理器覆盖。
如果用户确实需要亲自设置组件大小或位置,则应取消该容器的布局管理器,方法为:
setLayout(null);
AWT 绘图
可以在任何Java组件上绘图(通常Canvas和Panel组件更适合用于绘图)
每个Java组件都有一个public void paint(Graphics g)方法专门用于绘图目的,每次重画该组件时都自动调用paint方法。
每个Java组件都有一个Graphics类型的属性,该属性(对象)真正完成在相应组件上的绘图功能。
Graphics类中实现了许多绘图方法:
-- 绘制边框(非填充图形)
-- 填充特定区域
-- 绘制其它形状图形
AWT 绘图举例
import java.awt.*;
public class AWTDrawing {
private Frame f = new Frame(" Hello Out There!");
private Panel p = new Panel();
public void launchFrame() {
f.add(p);
f.setSize( 170,170);
f.setBackground( Color.blue);
f.setVisible( true);
p.setForeground(Color.red);
Graphics g = p.getGraphics();
g.drawArc(30,40,50,60,70,80);
g.fillArc(30,40,50,60,70,80);
}
public static void main( String args[]) {
AWTDrawing guiWindow = new AWTDrawing();
guiWindow.launchFrame();
}
}
import java.awt.*;
class SubPanel extends Panel{
public void paint(Graphics g){
g.drawString("this is a drawing test!",20,20);
g.drawLine(30,60,100,120);
g.draw3DRect(60,50,70,30,false);
}
}
public class AWTDrawing2 {
private Frame f = new Frame(" Hello Out There!");
private SubPanel p = new SubPanel();
public void launchFrame() {
f.add(p);
f.setSize(170,170);
f.setBackground( new Color(89,145,145));
f.setVisible( true);
}
public static void main( String args[]) {
AWTDrawing2 guiWindow = new AWTDrawing2();
guiWindow.launchFrame();
}
}