第一种写法(面向方法的写法)
package window.listener;
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 DemoCalc {
public static void main(String[] args) {//main方法
CalcAdd calcAdd = new CalcAdd();//实例CalcAdd
}
}
class CalcAdd extends Frame{//CalcAdd继承Frame
public CalcAdd(){//构建CalcAdd构造器
//建立三个文本框
TextField field1 = new TextField(10);//实列化TextField,设置文本变量field1,并且长度为10个字符数
TextField field2 = new TextField(10);//实列化TextField,设置文本变量field2,并且长度为10个字符数
TextField field3 = new TextField(20);//实列化TextField,设置文本变量field3,并且长度为10个字符数(实列化和对象我好像傻傻分不清了)
//建立一个按钮
Button button = new Button("=");//创建一个按钮,显示为等号
button.addActionListener(new CalcListener(field1,field2,field3));//button建立一个监听器,监听器实例化CalcListener的有参方法
//建立一个标签(标签是显示作用给使用者提示作用)
Label label = new Label("+");//标签,显示在窗口想要的位子,提示读者
//建立一个流式布局
setLayout(new FlowLayout());
//按顺序在窗口里排列
add(field1);//添加第一个文本
add(label);//添加标签
add(field2);//添加第二个文本
add(button);//添加按钮
add(field3);//添加第三个文本
pack();//自己以最好的方式弹出窗口(并不是弹窗位子,是弹出内部大小,删除该语句执行就明白了)
setVisible(true);//显示窗口
addWindowListener(new WindowAdapter() {//关闭窗口框架
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
//监听器类
class CalcListener implements ActionListener{//设置一个接口
//获取CalcAdd的三个文本变量
private TextField field1,field2,field3;//保护型, 直接调用TextField中的field1,field2,field3上面有设置该变量
public CalcListener(TextField field1,TextField field2,TextField field3) {//设置有参构造器
//目的是将CalcAdd里的field调入CalcListener
this.field1 = field1;//将field1赋值给该类的field1,目的是为了下面调用
this.field2 = field2;//将field2赋值给该类的field2,目的是为了下面调用
this.field3 = field3;//将field3赋值给该类的field3,目的是为了下面调用
}
@Override
public void actionPerformed(ActionEvent e) {
//获取加数和被加数
int n1 = Integer.parseInt(field1.getText());//获取第一个数(加数)
int n2 = Integer.parseInt(field2.getText());//获取第二个数(被加数)
//将这个两个加法运算后放入第三个文本框
field3.setText(""+(n1+n2));//field3设置一个文本框(要求String)但是使用“”输入暴力的让(n1+n2)强制输入,必须要有括号,因为加在字符后面没有括号为加字符
//清楚前面两个文本框
field1.setText("");//清除第一个文本框
field2.setText("");//清除第二个文本框
}
}
第二种写法
package window.listener;
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 TestCalc {
public static void main(String[] args) {
new Calculator().loadFrame();//实例化Calculator,并且调用方法loadFrame()
}
}
//计算器类
class Calculator extends Frame{//Calculator继承Frame
//属性
TextField num1,num2,num3;//设置文本类型变量
//方法
public void loadFrame(){//方法loadFrame
//3 个文本框
//TextField num1 = new TextField(10); //这里必须删除TextField,否则无法输出求和值 (原因不理解)
num1 = new TextField(10);//建立文本框num1长度为10个字符//
num2 = new TextField(10);//建立文本框num2长度为10个字符
num3 = new TextField(20);//建立文本框num3长度为20个字符
//一个按钮
Button button = new Button("=");//设置一个按钮,显示为等号
button.addActionListener(new MyCalculatorListener(this));//按钮设置一个监听器,实例化MyCalculatorListener调用自己属性方法
//一个标签
Label label = new Label("+");//加号标签
//布局
setLayout(new FlowLayout());//流式布局
//将文本框按钮标签加入窗口框架
add(num1);
add(label);
add(num2);
add(button);
add(num3);
pack();//自行排版
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;//将计算器属性方法赋值给自己calculator
}
@Override
public void actionPerformed(ActionEvent e) {
int n1 = Integer.parseInt(calculator.num1.getText());//将num1文本,包装成integer,然后赋值给int类型n1
int n2 = Integer.parseInt(calculator.num2.getText());//将num2文本,包装成integer,然后赋值给int类型n2
calculator.num3.setText(""+(n1+n2));//第三个文本暴力输出n1+n2的值
calculator.num1.setText("");//计算器清空文本框(第一个框)
calculator.num2.setText("");//计算器清空文本框(第二个框)
}
}
总结:实现一个程序目标,需要将该目标拆分为适当的步骤,足部实现。
学习地址https://www.bilibili.com/video/BV1DJ411B75F?p=9