AWT编程
AWT简介
AWT定义
AWT:一个GUI类库,抽象窗口工具集(CAbstract Window Toolkit)
使用AWT创建的图形界面应用和所在的运行平台有相同的界面风格
AWT的继承体系
Componet:
代表一个能以图片化形式显示出来,并可与用户交互的对象,例如Button代表一个按钮,TextField代表一个文本框等;
MenuComponent:
代表图形界面的菜单组件,包括MenuBar(菜单条)、MenuItem(菜单项)等子类
Container:
是一种特殊的Componet,它代表一种容器,可以盛装普通的Component
Container的继承体系
AWT使用
Window,Panel,ScrollPane的使用
- Window是可以独立存在的*窗口,默认使用BorderLayout管理其内部组件布局
- Panel可以容纳其他组件,但不能独立存在,它必须内嵌其他容器中使用,默认使用FlowLayout管理其内部组件布局
- ScrollPane是一个带滚动条的容器,它也不能独立存在,默认使用BorderLayout管理其内部组件布局
可能出现的中文编码问题解决办法:
- -Dfile.encoding=GBK
Window:
public class WindowDemo {
public static void main(String[] args) {
Frame frame = new Frame("window");
frame.setLocation(100, 100); //设置位置
frame.setSize(500, 300); //设置窗口大小
frame.setVisible(true); // 设置可见
}
}
Panel:
public class PanelDemo {
public static void main(String[] args) {
//Panel对象必须依附于Window
//创建window对象
Frame frame = new Frame("panel");
//创建Panel对象
Panel panel = new Panel();
panel.add(new TextField("textField")); // 添加文本框
panel.add(new Button("button")); // 添加按钮
//panel添加到window中
frame.add(panel);
//设置window位置和大小
frame.setBounds(100, 100, 500, 300);
//设置window可见
frame.setVisible(true);
}
}
ScrollPane:
public class ScrollPanelDemo {
public static void main(String[] args) {
//创建window对象
Frame frame = new Frame("ScrollPane");
//创建Panel对象
ScrollPane scrollPane = new ScrollPane(ScrollPane.SCROLLBARS_ALWAYS); //设置滚动条总是显示
scrollPane.add(new TextField("textField"));
scrollPane.add(new Button("button"));
//panel添加到window中
frame.add(scrollPane);
//设置window位置和大小
frame.setBounds(100, 100, 500, 300);
//设置window可见
frame.setVisible(true);
}
}
布局管理器
- LayoutMananger布局管理器可以根据运行平台来自动调整组件大小
FlowLayout
- 从左向右排列所有组件,遇到边界就会折回下一行重新开始
public class FlowLayoutDemo {
public static void main(String[] args) {
Frame frame = new Frame("FlowLayout");
// 设置布局管理器并且左对齐,水平和垂直间距都是20
frame.setLayout(new FlowLayout(FlowLayout.LEFT, 20, 20));
for (int i = 0; i < 100; i++) {
frame.add(new Button("button" + i));
}
//设置最佳大小
frame.pack();
frame.setVisible(true);
}
}
BorderLayout
- 将容器分为EAST,SOUTH,WEST,NORTH,CENTER五个区域,普通组件可以被放置在这五个区域中的任意一个
- 当改变使用BorderLayout的容器大小时,NORTH,SOUTH和CENTER区域水平调整,而EAST,WEST和CENTER区域垂直调整
- 添加组件时,需要指定添加到哪个区域中,如果没有指定添加到哪个区域中,则默认添加到中间区域中
- 如果向同一个区域中添加多个组件时,后放入的组件会覆盖先放入的组件
public class BorderLayoutDemo {
public static void main(String[] args) {
Frame frame = new Frame("BorderLayout");
// 水平间距30, 垂直间距10
frame.setLayout(new BorderLayout(30, 10));
frame.add(new Button("North"), BorderLayout.NORTH);
frame.add(new Button("South"), BorderLayout.SOUTH);
frame.add(new Button("East"), BorderLayout.EAST);
frame.add(new Button("West"), BorderLayout.WEST);
frame.add(new Button("Center"), BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
}
}
GridLayout
- 将容器分割成纵横线分割的网格,每个网格所占的区域大小相同
- 添加组件时,默认从左向右,从上向下依次添加到每个网格中
public class GridLayoutDemo {
public static void main(String[] args) {
Frame frame = new Frame("GridLayout");
// 添加输入文本框
Panel p_text = new Panel();
p_text.add(new TextField(30));
frame.add(p_text, BorderLayout.NORTH);
//添加数组
Panel p_num = new Panel();
// 3行5列
p_num.setLayout(new GridLayout(3, 5, 4, 4));
for (int i = 0; i < 10; i++) {
p_num.add(new Button(String.valueOf(i)));
}
p_num.add(new Button("+"));
p_num.add(new Button("-"));
p_num.add(new Button("*"));
p_num.add(new Button("/"));
p_num.add(new Button("."));
frame.add(p_num);
frame.pack();
frame.setVisible(true);
}
}
GridBagLayout
- 与GridLayout形似,但该布局可以占据多个网格
CardLayout
- 将加入容器的所有组件看成一叠卡片,每次只有最上面的组件可见。
public class CardLayoutDemo {
public static void main(String[] args) {
Frame frame = new Frame("CardLayout");
CardLayout cardLayout = new CardLayout();
//中间区域panel
Panel p1 = new Panel();
p1.setLayout(cardLayout);
String[] names = {"第一张","第二张","第三张","第四张","第五张"};
for (int i = 0; i < names.length; i++) {
p1.add(names[i], new Button(names[i]));
}
frame.add(p1);
//五个按钮区域
Panel p2 = new Panel();
Button b1 = new Button("上一张");
Button b2 = new Button("下一张");
Button b3 = new Button("第一张");
Button b4 = new Button("最后一张");
Button b5 = new Button("第三张");
//创建事件监听器,监听按钮的点击动作
ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
// 获取到按钮上的文字
String actionCommend = actionEvent.getActionCommand();
switch (actionCommend) {
case "上一张":
cardLayout.previous(p1);
break;
case "下一张":
cardLayout.next(p1);
break;
case "第一张":
cardLayout.first(p1);
break;
case "最后一张":
cardLayout.last(p1);
break;
case "第三张":
cardLayout.show(p1, "第三张");
break;
}
}
};
//把事件监听器和按钮绑定到一起
b1.addActionListener(listener);
b2.addActionListener(listener);
b3.addActionListener(listener);
b4.addActionListener(listener);
b5.addActionListener(listener);
p2.add(b1);
p2.add(b2);
p2.add(b3);
p2.add(b4);
p2.add(b5);
frame.add(p2, BorderLayout.SOUTH);
frame.pack();
frame.setVisible(true);
}
}
BoxLayout
- 可以在垂直和水平两个方向上拜访GUI组件
public class BoxLayoutDemo {
public static void main(String[] args) {
Frame frame = new Frame("BoxLayout");
//创建BoxLayout对象,该对象存放的组件是垂直存放
BoxLayout boxLayout = new BoxLayout(frame, BoxLayout.Y_AXIS);
frame.setLayout(boxLayout);
frame.add(new Button("button1"));
frame.add(new Button("button2"));
frame.pack();
frame.setVisible(true);
}
}
Box容器
- 该容器默认布局管理器是BoxLayout,大多数情况下,使用Box容器容纳多个GUI组件,然后再把Box容器作为一个组件,添加到其他的容器中,从而形成整体窗口布局。
public class BoxDemo {
public static void main(String[] args) {
Frame frame = new Frame("Box");
//创建水平排列组件的Box容器
Box hBox = Box.createHorizontalBox();
hBox.add(new Button("h_button1"));
hBox.add(Box.createHorizontalGlue()); // 在两个方向上拉伸
hBox.add(new Button("h_button2"));
hBox.add(Box.createHorizontalStrut(30)); //固定分割长度
hBox.add(new Button("h_button3"));
//创建垂直排列组件的Box容器
Box vBox = Box.createVerticalBox();
vBox.add(new Button("v_button1"));
vBox.add(Box.createVerticalGlue());
vBox.add(new Button("v_button2"));
vBox.add(Box.createVerticalStrut(30));
vBox.add(new Button("v_button3"));
//添加到frame中
frame.add(hBox, BorderLayout.NORTH);
frame.add(vBox);
frame.pack();
frame.setVisible(true);
}
}
AWT中的基本组件
组件名 | 功能 |
---|---|
Button | 按钮 |
Canvas | 用于绘图的画布 |
Checkbox | 复选框组件(也可当单元框组件使用) |
CheckboxGroup | 用于将多个Checkbox组件组合成一组,一组Checkbox组件将只有一个被选中,即全部变成单选框组件 |
Choice | 下拉选择框 |
Frame | 窗口,在GUI程序里通过该类创建窗口 |
Label | 标签类,用于放置提示性文本 |
List | 列表框组件,可以添加多项条目 |
Panel | 不能单独存在基本容器类,必须放在其他容器中 |
Scrollbar | 滑动条组件。如果需要用户输入位于某个范围的值,就可以使用滑动条组件,比如调色板中设置RGB的三个值所用的滑动条。当创建一个滑动条时,必须指定它的方向、初始值、滑块的大小、最小值和最大值。 |
ScrollPane | 带水平及垂直滑动条的容器组件 |
TextArea | 多行文本域 |
TextField | 单行文本域 |
public class BasicComponentDemo {
Frame frame = new Frame("基本组件");
//多行文本区域
TextArea ta = new TextArea(5, 20);
//下拉选择框
Choice colorChooser = new Choice();
//选择框
CheckboxGroup cbg = new CheckboxGroup();
Checkbox male = new Checkbox("男", cbg, true);
Checkbox female = new Checkbox("女", cbg, false);
//选择框
Checkbox isMarried = new Checkbox("是否已婚?");
//单行文本区域
TextField tf = new TextField(50);
Button ok = new Button("确认");
//列表框
List colorList = new List(6, true);
public void init(){
//组装底部
Box bBox = Box.createHorizontalBox();
bBox.add(tf);
bBox.add(ok);
frame.add(bBox, BorderLayout.SOUTH);
//组装选择部分
colorChooser.add("红色");
colorChooser.add("蓝色");
colorChooser.add("绿色");
Box cBox = Box.createHorizontalBox();
cBox.add(colorChooser);
cBox.add(male);
cBox.add(female);
cBox.add(isMarried);
frame.add(cBox);
//组装文本域和选择部分
Box topLeft = Box.createVerticalBox();
topLeft.add(ta);
topLeft.add(cBox);
frame.add(topLeft);
//组装顶部左边和列表框
Box top = Box.createHorizontalBox();
colorList.add("红色");
colorList.add("绿色");
colorList.add("蓝色");
top.add(topLeft);
top.add(colorList);
frame.add(top);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
BasicComponentDemo bc = new BasicComponentDemo();
bc.init();
}
}