GUI编程---AWT
GUI编程
组件
- 窗口
- 弹窗
- 面板
- 文本框
- 列表框
- 按钮
- 图片
- 监听事件
- 鼠标事件
- 外挂
1. 简介
GUI核心技术:Swing,AWT
为什么很少使用GUI了?
- 界面不美观
- 需要jre环境
为什么要学习?
- MVC架构基础,监听事件基础
- 写出自己心中想要的小工具
- 可能需要维护Swing界面
2. AWT
2.1 AWT介绍
- 包含了很多类类和接口;GUI:图形用户界面
- 元素:按钮,窗口,文本框......
- java.awt

2.2 组件和容器
1. Frame
public class TestFrame1 {
//GUI的第一个界面
public static void main(String[] args) {
//Frame JDK 看源码
Frame frame = new Frame("我的第一个java图形界面窗口");
//需要设置可见性
frame.setVisible(true);
//设置窗口大小
frame.setSize(400, 400);
//设置背景颜色 Color
frame.setBackground(new Color(254, 253, 254, 78));
//弹出的初始位置
frame.setLocation(300, 300);
//设置大小固定
frame.setResizable(false);
}
}

尝试设置多个窗口,继承Frame,利用封装。写个方法,然后调用类创建
public class TestFrame2 {
public static void main(String[] args) {
MyFrame myFrame1 = new MyFrame(100, 100, 300, 300, Color.RED);
MyFrame myFrame2 = new MyFrame(100, 400, 300, 300, Color.BLUE);
MyFrame myFrame3 = new MyFrame(400, 100, 300, 300, Color.YELLOW);
MyFrame myFrame4 = new MyFrame(400, 400, 300, 300, Color.GRAY);
}
}
class MyFrame extends Frame {
static int id =0;//若设置多个窗口,用计数器
public MyFrame(int x,int y,int w,int h, Color color){
super("MyFrame"+(++id));
setVisible(true);
setBackground(color);
setBounds(x,y,w,h);
setResizable(false);
}
}

2. 面板
解决了窗口关闭问题:监听事件
public class TestPanel {
public static void main(String[] args) {
Frame frame = new Frame();
Panel panel = new Panel();
//设置布局
frame.setLayout(null);
//坐标
frame.setBounds(100, 100, 500, 500);
frame.setBackground(new Color(18, 109, 62));
//panel设置坐标背景颜色
panel.setBounds(50, 50, 300, 300);
panel.setBackground(new Color(133, 25, 20));
//frame.add(panel)
frame.add(panel);
frame.setVisible(true);
//监听事件监听窗口关闭System.exit(0)
//适配器模式
frame.addWindowListener(new WindowAdapter() {
//点击窗口关闭要做的事情
@Override
public void windowClosing(WindowEvent e) {
//结束程序
System.exit(0);
}
});
}
}

3. 布局管理器
- 流式布局
- 东西南北中
- 表格布局
3.1 流式布局
public class TestLayout {
public static void main(String[] args) {
Frame frame = new Frame();
//组件-按钮
Button button1 = new Button("button1");
Button button2 = new Button("button2");
Button button3 = new Button("button3");
Button button4 = new Button("button4");
//设置为流式布局
//frame.setLayout(new FlowLayout());
//frame.setLayout(new FlowLayout(FlowLayout.LEFT));//从左开始流式布局
frame.setLayout(new FlowLayout(FlowLayout.RIGHT));//从右开始流式布局
frame.setBounds(100,100,500,500);
//添加按钮
frame.add(button1);
frame.add(button2);
frame.add(button3);
frame.add(button4);
frame.setVisible(true);
}
}
3.2 东西南北中
public class TestBorderLayout {
public static void main(String[] args) {
Frame f = new Frame("TestBorderLayout");
Button east = new Button("East");
Button west = new Button("West");
Button south = new Button("South");
Button north = new Button("North");
Button center = new Button("Center");
f.add(east,BorderLayout.EAST);
f.add(west,BorderLayout.WEST);
f.add(south,BorderLayout.SOUTH);
f.add(north, BorderLayout.NORTH);
f.add(center,BorderLayout.CENTER);
f.setSize(300,300);
f.setVisible(true);
}
}
3.3 表格布局
public class TestGridLayout {
public static void main(String[] args) {
Frame f = new Frame("TestGridLayout");
Button btn1 = new Button("btn1");
Button btn2 = new Button("btn2");
Button btn3 = new Button("btn3");
Button btn4 = new Button("btn4");
Button btn5 = new Button("btn5");
Button btn6 = new Button("btn6");
f.setLayout(new GridLayout(3,2));
f.add(btn1);
f.add(btn2);
f.add(btn3);
f.add(btn4);
f.add(btn5);
f.add(btn6);
f.pack();//java函数!自动布局
f.setVisible(true);
}
}
3.4 练习组合(主要是思路)
public class practice {
public static void main(String[] args) {
Frame frame = new Frame("练习");
//窗口设置
frame.setBackground(Color.black);
frame.setBounds(100, 100, 400, 300);
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, 2));
//创建1和2的button
p1.add(new Button("East-1"), BorderLayout.EAST);
p1.add(new Button("West-1"), BorderLayout.WEST);
p2.add(new Button("p2-btn-1"));
p2.add(new Button("p2-btn-2"));
p1.add(p2, BorderLayout.CENTER);
//创建3和4d1button
p3.add(new Button("East-2"), BorderLayout.EAST);
p3.add(new Button("West-2"), BorderLayout.WEST);
p4.add(new Button("p4-btn-1"));
p4.add(new Button("p4-btn-2"));
p4.add(new Button("p4-btn-3"));
p4.add(new Button("p4-btn-4"));
p3.add(p4, BorderLayout.CENTER);
//添加面板
frame.add(p1);
frame.add(p3);
//关闭界面
//监听事件监听窗口关闭System.exit(0)
//适配器模式
frame.addWindowListener(new WindowAdapter() {
//点击窗口关闭要做的事情
@Override
public void windowClosing(WindowEvent e) {
//结束程序
System.exit(0);
}
});
}
}

2.3 简单计算器
oop原则:组合,大于继承!
2.3.1 初始代码(面向过程)
public class TestCalc {
public static void main(String[] args) {
Calculator my = new Calculator();
}
}
//计算器类
class Calculator extends Frame {
public Calculator() {
//三个文本框
TextField text1 = new TextField(10);
TextField text2 = new TextField(10);
TextField text3 = new TextField(20);
//一个按钮
Button button = new Button("=");
button.addActionListener(new MyCalculatorListener(text1,text2,text3));
//一个标签
Label label = new Label("+");
//布局
setLayout(new FlowLayout());
add(text1);
add(label);
add(text2);
add(button);
add(text3);
pack();
setVisible(true);
addWindowListener(new WindowAdapter() {
//点击窗口关闭要做的事情
@Override
public void windowClosing(WindowEvent e) {
//结束程序
System.exit(0);
}
});
}
}
//监听器类
class MyCalculatorListener implements ActionListener {
//获取三个变量
private TextField text1,text2,text3;
public MyCalculatorListener(TextField text1,TextField text2,TextField text3) {
this.text1 = text1;
this.text2 = text2;
this.text3 = text3;
}
@Override
public void actionPerformed(ActionEvent e) {
//1.获得加数与被加数
int n1 = Integer.parseInt(text1.getText());
int n2 = Integer.parseInt(text2.getText());
//2.将这个值加法运算后放到第三个框
text3.setText(""+ (n1+n2));
//3.清除前两个框
text1.setText("");
text2.setText("");
}
}
2.3.2 完全面向对象(组合)
public class TestCalc {
public static void main(String[] args) {
new Calculator().loadFrame();
}
}
//计算器类
class Calculator extends Frame {
TextField num1,num2,num3;
public void loadFrame() {
//三个文本框,一个按钮,一个标签
num1 = new TextField(10);
num2 = new TextField(10);
num3 = new TextField(20);
Button button = new Button("=");
//创建事件监听器
MyCalculatorListener listener = new MyCalculatorListener(this);
button.addActionListener(listener);
Label label = new Label("+");
//布局
setLayout(new FlowLayout());
add(num1);
add(label);
add(num2);
add(button);
add(num3);
pack();
setSize(480,70);
setBackground(new Color(255,213,123));
setVisible(true);
addWindowListener(new WindowAdapter() {
//点击窗口关闭要做的事情
@Override
public void windowClosing(WindowEvent e) {
//结束程序
System.exit(0);
}
});
}
}
//监听器类
class MyCalculatorListener implements ActionListener {
//获取计算器对象 在一个类中组合另外一个类
Calculator calculator = null;
public MyCalculatorListener(Calculator calculator) {
this.calculator = calculator;
}
@Override
public void actionPerformed(ActionEvent e) {
//1.获得加数与被加数
int n1 = Integer.parseInt(calculator.num1.getText());
int n2 = Integer.parseInt(calculator.num2.getText());
//2.将这个值加法运算后放到第三个框
calculator.num3.setText(""+ (n1+n2));
//3.清除前两个框
calculator.num1.setText("");
calculator.num2.setText("");
}
}
2.3.3 内部类
内部类最大特点:可以畅通无阻的访问外部类的方法,属性
//内部类优化代码
public class TestCalc2 {
public static void main(String[] args) {
new Calculator2().loginFrame();
}
}
class Calculator2 extends Frame {
//属性 三个文本框 一个button 一个标签
TextField num1,num2,num3;
Button button;
Label label;
//方法
public void loginFrame(){
num1=new TextField(10);
num2=new TextField(10);
num3=new TextField(20);
button=new Button("=");
button.addActionListener(new CaclActionListener());
label=new Label("+");
//布局
setLayout(new FlowLayout());//流式布局
add(num1);
add(label);
add(num2);
add(button);
add(num3);
pack();//自动优化布局
setVisible(true);
setSize(480,70);
setBackground(new Color(255,213,123));
addWindowListener(new WindowAdapter() {
//点击窗口关闭要做的事情
@Override
public void windowClosing(WindowEvent e) {
//结束程序
System.exit(0);
}
});
}
private class CaclActionListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
//获取加数被加数
Integer in1=Integer.parseInt(num1.getText());
Integer in2=Integer.parseInt(num2.getText());
//将加法运算后方到第三个
num3.setText(""+(in1+in2));
//清空前两个框
num1.setText("");
num2.setText("");
}
}
}
2.4 画笔
public class TestPaint {
public static void main(String[] args) {
new MyPaint().loadFrame();
}
}
class MyPaint extends Frame {
public void loadFrame() {
setBounds(200,200,600,500);
setVisible(true);
addWindowListener(new WindowAdapter() {
//点击窗口关闭要做的事情
@Override
public void windowClosing(WindowEvent e) {
//结束程序
System.exit(0);
}
});
}
//画笔
@Override
public void paint(Graphics g) {
//颜色
g.setColor(Color.red);
g.fillOval(100,100,100,100);
//画笔画完,还原成最初颜色
}
}
2.5 鼠标监听
思路:

//测试鼠标监听事件
public class MouseListener {
public static void main(String[] args) {
new MyMouse("画图");
}
}
//自己的鼠标类
class MyMouse extends Frame {
//画画需要画笔,需要监听当前的位置,需要集合存储这个点
ArrayList points;
public MyMouse(String title) {
super(title);
setBounds(200,200,400,300);
//存鼠标点击的点:集合
points = new ArrayList<>();
setVisible(true);
//鼠标监听器,针对于这个窗口
this.addMouseListener(new MyMouseListener());
addWindowListener(new WindowAdapter() {
//点击窗口关闭要做的事情
@Override
public void windowClosing(WindowEvent e) {
//结束程序
System.exit(0);
}
});
}
@Override
public void paint(Graphics g) {
//画画,监听鼠标事件
//获取点
Iterator iterator = points.iterator();
while (iterator.hasNext()) {
Point point = (Point) iterator.next();
g.setColor(Color.blue);
g.fillOval(point.x,point.y,5,5);
}
}
//添加一个点到界面上
public void addPaint(Point point) {
points.add(point);
}
//内部类,适配器模式
private class MyMouseListener extends MouseAdapter {
//鼠标按下,弹起,按住不放
@Override
public void mousePressed(MouseEvent e) {
MyMouse mouse = (MyMouse) e.getSource();
//我们点击的时候,就会在屏幕上产生一个点!
//这个点就是鼠标的点;添加到points集合中去
mouse.addPaint(new Point(e.getX(),e.getY()));
//每次点击鼠标都需要重画一遍
mouse.repaint();//刷新
}
}
}

2.6 键盘监听
public class TestKeyListener {
public static void main(String[] args) {
new KeyFrame();
}
}
class KeyFrame extends Frame {
public KeyFrame() {
setBounds(1,2,300,400);
setVisible(true);
//匿名内部类
this.addKeyListener(new KeyAdapter() {
//键盘按下
@Override
public void keyPressed(KeyEvent e) {
//获得键盘下的哪一个键
int keyCode = e.getKeyCode();
if (keyCode == KeyEvent.VK_UP)
System.out.println("你按下了上键:" + keyCode);
}
});
addWindowListener(new WindowAdapter() {
//点击窗口关闭要做的事情
@Override
public void windowClosing(WindowEvent e) {
//结束程序
System.exit(0);
}
});
}
}

浙公网安备 33010602011771号