事件监听
- 入门示例代码:
public class TestActionEvent {
public static void main(String[] args) {
//按下按钮,触发一些事件
Frame frame = new Frame();
Button button = new Button();
//因为addActionListener()需要一个ActionListener,所以我们需要构造一个ActionListener
MyActionListener myActionListener=new MyActionListener();
button.addActionListener(myActionListener);
frame.add(button,BorderLayout.CENTER);
frame.setVisible(true);
frame.pack();
windowClose(frame); //关闭窗口
}
//关闭窗口的事件
private static void windowClose(Frame frame){
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
//事件监听
class MyActionListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("aaa"); //动作
}
}
- 多个按钮共享一个事件
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TestActionTwo {
public static void main(String[] args) {
//两个按钮实现同一个监听
//开始 停止
Frame frame=new Frame();
Button button1=new Button("Open");
Button button2=new Button("Close");
frame.add(button1,BorderLayout.EAST);
frame.add(button2,BorderLayout.WEST);
//可以显示的定义触发会返回的命令,如果不显式定义,会走默认值
//多个按钮可以只写一个监听类
button2.setActionCommand("button2_stop");
MyActionListener2 myActionListener2 = new MyActionListener2();
button1.addActionListener(myActionListener2);
button2.addActionListener(myActionListener2);
frame.setVisible(true);
}
}
class MyActionListener2 implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
//e.getActionCommand() 获取按钮上的信息
System.out.println("按钮被点击了:msg"+e.getActionCommand());
}
}
输入框(TextField)事件监听
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TextText01 {
public static void main(String[] args) {
//main方法只负责启动,规范代码
MyFrame myFrame = new MyFrame();
}
}
class MyFrame extends Frame{
public MyFrame(){
TextField textField = new TextField();
add(textField);//继承自Frame类,不需要通过frame调用,可以直接add
//监听这个文本框输入的文字
MyActionListener3 myActionListener3 = new MyActionListener3();
//按下回车键就会触发这个输入框的事件
textField.addActionListener(myActionListener3);
//设置替换编码
textField.setEchoChar('*'); //用在输入密码的情景。返回正常文本,输入框显示*文本
setVisible(true);
pack();;
}
}
class MyActionListener3 implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
TextField field= (TextField) e.getSource(); //获得一些资源,返回的一个对象
// e.getSource()产生的object对象可以向下转型
System.out.println( field.getText()); //获得输入框中的文本
field.setText(""); //null 每次回车后清空输入框中的文本
}
}
练习题:简易计算器
界面要求:
初步实现代码:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TextCalculator {
public static void main(String[] args) {
Calculator calculator = new Calculator();
}
}
//计算器类
class Calculator extends Frame {
public Calculator(){
//三个文本框
TextField field1=new TextField();
TextField field2=new TextField();
TextField field3=new TextField();
//一个按钮 要加监听事件
Button button = new Button("=");
button.addActionListener(new MyActionListener4(field1,field2,field3));
//一个标签
Label label = new Label("+");
//元素添加入面板
setLayout(new GridLayout(1,5));
add(field1);
add(label);
add(field2);
add(button);
add(field3);
setVisible(true);
pack();
}
}
//监听器类
class MyActionListener4 implements ActionListener{
private TextField field1,field2,field3;
//获取三个变量
public MyActionListener4(TextField field1,TextField field2,TextField field3){
this.field1=field1;
this.field2=field2;
this.field3= field3;
}
@Override
public void actionPerformed(ActionEvent e) {
//1.获得加数和被加数 String转Int 用 Integer.parseInt();
Integer a= Integer.parseInt(field1.getText());
Integer b= Integer.parseInt(field2.getText());
//2.将这两个值+运算后,放到第三个框
field3.setText(" "+(a+b));
//3.清除前两个框
field1.setText("");
field2.setText("");
}
}
改造为面向对象的代码:(组合)
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TextCalculator {
public static void main(String[] args) {
new Calculator().LoadFrame(); //注意理解
}
}
//计算器类 一个类里调用另一个类的引用
class Calculator extends Frame {
//属性
TextField field1,field2,field3;
//方法
public void LoadFrame(){
field1=new TextField(10); //字符数
field2=new TextField(10);
field3=new TextField(10);
Button button = new Button("=");
button.addActionListener(new MyActionListener4(this));//括号里放自己 this
Label label = new Label("+");
//布局
setLayout(new GridLayout(1,5));
add(field1);
add(label);
add(field2);
add(button);
add(field3);
setVisible(true);
pack();
}
// 删除多余的构造器 public Calculator(){}
}
//监听器类
class MyActionListener4 implements ActionListener{
//获取计算器这个对象,在一个类里组合另一个类;
Calculator calculator=null; //组合
public MyActionListener4( Calculator calculator){
this.calculator=calculator;
}
@Override
public void actionPerformed(ActionEvent e) {
//1.获得加数和被加数 String转Int 用 Integer.parseInt();
int a= Integer.parseInt(calculator.field1.getText());
int b= Integer.parseInt(calculator.field2.getText());
//2.将这两个值+运算后,放到第三个框
calculator.field3.setText(" "+(a+b));
//3.清除前两个框
calculator.field1.setText("");
calculator.field2.setText("");
}
}
内部类
- 更好的包装
计算器例题改进:监听器做Calculator的内部类
public class TextCalculator {
public static void main(String[] args) {
new Calculator().LoadFrame(); //注意理解
}
}
//计算器类 一个类里调用另一个类的引用
class Calculator extends Frame {
//属性
TextField field1,field2,field3;
//方法
public void LoadFrame(){
//三个文本框
field1=new TextField(); //把属性提出到类Calculator里
field2=new TextField();
field3=new TextField();
//一个按钮 要加监听事件
Button button = new Button("=");
button.addActionListener(new MyActionListener4());//括号里放自己 this
//一个标签
Label label = new Label("+");
//元素添加入面板
setLayout(new GridLayout(1,5));
add(field1);
add(label);
add(field2);
add(button);
add(field3);
setVisible(true);
pack();
}
// 删除多余的构造器 public Calculator(){}
private class MyActionListener4 implements ActionListener{ //监听器类
//内部类最大的好处就是,可以畅通无阻的访问外部的属性和方法
@Override
public void actionPerformed(ActionEvent e) {
//1.获得加数和被加数 String转Int 用 Integer.parseInt();
int a= Integer.parseInt(field1.getText());
int b= Integer.parseInt(field2.getText());
//2.将这两个值+运算后,放到第三个框
field3.setText(" "+(a+b));
//3.清除前两个框
field1.setText("");
field2.setText("");
}
}
}
- 组合加内部类的回顾复习
oop原则:组合 大于继承!!!
class A extends B{
} //继承
class A{
pubilc B b;
} //组合