什么是AWT?
- Awt(Abstract Window Toolkit)全称抽象窗口工具集。是基本的GUI类库,AWT也是窗口框架,包含不同平台的窗口系统改中的公共组件。
- 在AWT包中提供的工具类主要有以下三种:
- 组件:Component
- 容器:Container
- 布局管理器:LayoutManager
- 什么是组件?
- 在图形界面中的按钮、标签、菜单等等,它们就是一个个的组件
- 什么是容器?
- 所有的AWT组件都会放在容器中,然后可以对它的颜色、大小、位置进行设置
- 什么是布局管理器?
- 布局管理器可以使容器中的组件按照规定的方式进行排放,另外即使容器的大小发生了变化,布局管理器也可以准确的组件放到指定的位置。
组件和容器
- 窗体Frame:
- Frame就是产生一个窗口界面,并且我们可以对其的出现位置、窗口大小、背景颜色、是否可以关闭等等进行配置
- 演示:
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class MyFrame extends Frame {
//设置窗体出现的位置以及大小、背景颜色、是否可见、以及关闭
static int count=0;
public MyFrame(int x,int y,int w,int h,Color color) {
super("窗体:"+(++count));
this.setBounds(x,y,w,h);
this.setBackground(color);
this.setVisible(true);
//关闭窗体
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
class Test01{
public static void main(String[] args) {
MyFrame myFrame1 = new MyFrame(10, 10, 400, 400, Color.CYAN);
MyFrame myFrame2 = new MyFrame(20, 20, 222, 222, Color.black);
MyFrame myFrame3 = new MyFrame(40, 40, 333, 333, Color.white);
}
}
程序结果:
- 注意:如果需要让用户关闭界面,那么需要窗口监听器WindowListener,然后参数选择WindowAdapter再适配closing即可。
- 画板Panel
- 画板就是在窗体上产生一个新的画面,需要注意的是它必须依赖于窗体而存在,调用frame的add方法进行添加。
- 演示:
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class MyPanel {
public static void main(String[] args) {
Frame frame = new Frame("我的窗体");
Panel panel = new Panel();
//设置布局
frame.setLayout(null);
//设置窗体
frame.setBounds(10,10,400,400);
frame.setBackground(Color.blue);
frame.setVisible(true);
//设置画板
panel.setBounds(10,10,100,100);
panel.setBackground(Color.cyan);
//把画板添加到窗体中
frame.add(panel);
//添加窗口监听关闭界面
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
程序结果:
- 如果我们要使用组件,那么就要对它的布局模式进行管理,否则会出现组件不显示的情况
布局管理器
- 流式布局:
- 流式布局就是按照用户添加组件的顺序对组件进行摆放
- 在flowout的构造方法中可以选择位置
- 演示:
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class FlowTest {
public static void main(String[] args) {
Frame frame = new Frame("我的窗体");
frame.setBounds(10,10,400,400);
frame.setBackground(Color.blue);
frame.setVisible(true);
//给窗体添加按钮
Button button = new Button("btn-1");
Button button1 = new Button("btn-2");
Button button2 = new Button("btn-3");
frame.add(button);
frame.add(button1);
frame.add(button2);
//设置流式局
frame.setLayout(new FlowLayout());
//关闭页面
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
程序结果:
- 位置布局:
- BorderLayout可以通过方向信息对组件的位置进行设置
- 演示:
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class BorderTest {
public static void main(String[] args) {
Frame frame = new Frame();
frame.setBounds(10,10,400,400);
frame.setVisible(true);
frame.setBackground(Color.CYAN);
//给窗体添加按钮
Button button = new Button("btn-1");
Button button1 = new Button("btn-2");
Button button2 = new Button("btn-3");
//设置布局模式
frame.add(button,BorderLayout.NORTH);
frame.add(button1,BorderLayout.SOUTH);
frame.add(button2,BorderLayout.CENTER);
//通过窗体监听关闭界面
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
程序结果:
- 表格布局:
- 可以把窗体分为自定义数量的行和列
- 演示:
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class GridTest {
public static void main(String[] args) {
Frame frame = new Frame();
frame.setBounds(10,10,400,400);
frame.setVisible(true);
frame.setLayout(new GridLayout(2,2));
//给窗体添加按钮
Button button = new Button("btn-1");
Button button1 = new Button("btn-2");
Button button2 = new Button("btn-3");
Button button3 = new Button("btn-4");
frame.add(button);
frame.add(button1);
frame.add(button2);
frame.add(button3);
//关闭页面
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
程序结果:
练习题
实现如图的窗体:
- 分析:分为上下两个画板,四角的按钮可以使用borderlayout进行布局,上面画板的两个大按钮,也可以根据borderlayout进行布局。
- 演示:
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class PanelTest {
public static void main(String[] args) {
Frame frame = new Frame();
//设置窗体的特征
frame.setBounds(10,10,400,400);
frame.setVisible(true);
frame.setLayout(new GridLayout(2,1));
//声明画板上部
Panel p1 = new Panel(new BorderLayout());
Panel p2 = new Panel(new GridLayout(2,1));
//声明画板下部
Panel p3 = new Panel(new BorderLayout());
Panel p4= new Panel(new GridLayout(2,1));
//给上部的画板添加组件
p1.add(new Button("btn-1"),BorderLayout.WEST);
p1.add(new Button("btn-2"),BorderLayout.EAST);
p2.add(new Button("btn-up"));
p2.add(new Button("btn-down"));
//再把p2加入到p1中
p1.add(p2);
//给下部的画板添加组件
p3.add(new Button("btn-3"),BorderLayout.WEST);
p3.add(new Button("btn-4"),BorderLayout.EAST);
for (int i = 0; i < 4; i++) {
p4.add(new Button("btn-center"+i));
}
p3.add(p4,BorderLayout.CENTER);
frame.add(p1);
frame.add(p3);
//增加窗口监听关闭窗体
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
程序结果为:
事件监听
- 使用监听适配器关闭窗体
- 设配器模式中在接口和实现类之间多加了一层抽象类,那么实现类直接继承抽象类就可以根据自己的需要对方法进行重写,因而在整个事件处理中提供了很多Adapter(适配器)类,方便用户自己调用
- 演示使用适配器关闭窗体
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class CloseWin {
public static void main(String[] args) {
Frame frame = new Frame();
frame.setBounds(10,10,400,400);
frame.setVisible(true);
//使用适配器关闭窗体
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
动作监听
- 使用ActionListener接口处理按钮的动作事件。
- 演示:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class ButtonListener {
public static void main(String[] args) {
Frame frame = new Frame();
frame.setBounds(10,10,400,400);
frame.setVisible(true);
frame.setLayout(new FlowLayout());
//添加按钮
Button button = new Button("btn-1");
Button button1 = new Button("btn-2");
//设置监听,当点击按钮的时候产生反馈
MyListener myListener = new MyListener();
button.addActionListener(myListener);
button1.addActionListener(myListener);
frame.add(button);
frame.add(button1);
//关闭窗体
Myclose(frame);
}
public static void Myclose(Frame frame){
//增加窗体监听
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
class MyListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("你点击了按钮");
}
}
程序结果:
- 上一个例子中的两个按钮只能产生相同的反馈,那么如何让不同的按钮返回不同的反馈呢?
- 我们可以使用setActionCommand方法来给每个按钮设置返回的信息,然后在实现ActionListener类中调用getActionCommand方法即可
- 演示:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class ButtonListener {
public static void main(String[] args) {
Frame frame = new Frame();
frame.setBounds(10,10,400,400);
frame.setVisible(true);
frame.setLayout(new FlowLayout());
//添加按钮
Button button = new Button("btn-1");
button.setActionCommand("你按了第一个按钮");
Button button1 = new Button("btn-2");
button1.setActionCommand("你按了第二个按钮");
//设置监听,当点击按钮的时候产生反馈
MyListener myListener = new MyListener();
button.addActionListener(myListener);
button1.addActionListener(myListener);
frame.add(button);
frame.add(button1);
//关闭窗体
Myclose(frame);
}
public static void Myclose(Frame frame){
//增加窗体监听
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
class MyListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e.getActionCommand());
}
}
程序结果:
- 制作一个简易计算器
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Calc {
public static void main(String[] args) {
new MyCalc().myframe();
}
}
class MyCalc extends Frame{
TextField num1=null;
TextField num2=null;
TextField sum=null;
public MyCalc() {
super();
}
public void myframe(){
this.setBounds(10,10,200,200);
this.setVisible(true);
this.setLayout(new FlowLayout());
//添加组件
num1 = new TextField(10);
num2 = new TextField(10);
sum = new TextField(20);
Button button = new Button("=");
Label label = new Label("+");
//在用户点击button时要返回两个数的和,因此要实现ActionListener接口
MyListener2 myListener2 = new MyListener2();
button.addActionListener(myListener2);
this.add(num1);
this.add(label);
this.add(num2);
this.add(button);
this.add(sum);
//关闭窗体
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
//这个时候我们使用内部类,因为内部类可以直接访问外部类的成员
class MyListener2 implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
int num11 = Integer.parseInt(num1.getText());
int num22 = Integer.parseInt(num2.getText());
sum.setText(""+(num11+num22));
num1.setText("");
num2.setText("");
}
}
}
程序结果:
- 在这个例题中,我们巧妙地运行内部类可以直接访问外部类成员地性质快速的解决了传参的问题
- 监听文本框输入的内容:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TextFiledTest {
public static void main(String[] args) {
Frame frame = new Frame();
frame.setVisible(true);
frame.setBounds(10,10,200,200);
frame.setLayout(new FlowLayout());
TextField textField = new TextField();
textField.setText("哈哈哈");
frame.add(textField);
//监听文本框
textField.addActionListener(new MyListener3());
//关闭窗体
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
class MyListener3 implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
TextField source = (TextField) e.getSource();
System.out.println("你输入的内容是:"+source.getText());
}
}
程序结果:
键盘监听
- 键盘监听可以使用KeyListener接口。
- KeyListener常用方法:
- 在监听键盘时,我们不仅使用KeyListener中的方法,还配合着使用KeyEvent中的方法
- 演示:
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class KeyListenerTest {
public static void main(String[] args) {
Frame frame = new Frame();
frame.setBounds(10,10,400,400);
frame.setVisible(true);
//增加键盘监听
frame.addKeyListener(new MyKey());
//关闭窗体
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
class MyKey implements KeyListener{
@Override
public void keyTyped(KeyEvent e) {
//输入某个键时调用
}
@Override
public void keyPressed(KeyEvent e) {
//按下某个键时调用
int keyCode = e.getKeyCode();
if (keyCode== KeyEvent.VK_UP){
System.out.println("你输入了上键");
}
}
@Override
public void keyReleased(KeyEvent e) {
//松开某个键时调用
}
}
- 注意:在对键盘监听中,也可以使用KeyAdapter适配器。
鼠标监听
- 鼠标监听使用MouseListener接口
- 常用方法:
- 在使用鼠标监听时我们还会配合MouseEvent类中的方法来使用
- MouseEvent的常用方法
- 演示:用鼠标画图
public class MouseTest {
public static void main(String[] args) {
MyFrame frame = new MyFrame();
MyClose(frame);
}
public static void MyClose(Frame frame){
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
class MyFrame extends Frame {
ArrayList points;
public MyFrame() {
super();
this.setVisible(true);
this.setBounds(10,10,400,400);
//存放鼠标的点
points = new ArrayList<>();
//增加鼠标监听
this.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
Frame source = (Frame) e.getSource();
points.add(new Point(e.getX(), e.getY()));
source.repaint();
}
});
}
@Override
public void paint(Graphics g) {
super.paint(g);
Iterator iterator = points.iterator();
while (iterator.hasNext()){
Point point = (Point) iterator.next();
//把点加入到points集合中
g.setColor(Color.cyan);
g.fillOval(point.x,point.y,10,10);
}
}
}
- 程序结果