事件监听
当某一个按钮或者文本框按下去的时候,会执行的动作
举例:
public static void main(String[] args) {
Frame frame = new Frame();
Button button = new Button("button");
MyActionListener myActionListener = new MyActionListener();
button.addActionListener(myActionListener);
frame.add(button,BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
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 actionEvent) {
System.out.println("aaa");
}
当点击这个button时,会输出aaa,
两个按钮公用一个监听事件
举例:
//两个按钮实现同一个监听
public class TestActionEvent2 {
public static void main(String[] args) {
//设置窗体
Frame frame = new Frame("开始-停止");
frame.pack();
frame.setVisible(true);
Button button1 = new Button("start");
Button button2 = new Button("stop");
//可以显示的定义触发会返回的命令,如果不显示定义,则会走默认的值
button2.setActionCommand("button-stop");
frame.add(button1,BorderLayout.NORTH);
frame.add(button2,BorderLayout.SOUTH);
WindowClose(frame);
//两个Button上添加监听事件
MyMonitor myMonitor = new MyMonitor();
button1.addActionListener(myMonitor);
button2.addActionListener(myMonitor);
}
private static void WindowClose(Frame frame){
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
class MyMonitor implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
//e.getActionCommand()获取按钮上的信息
System.out.println("按钮被点击了:msg"+e.getActionCommand());
}
}
运行 结果为:
输入框事件监听
举例:
class MyFrame extends Frame{
public MyFrame(){
TextField textField = new TextField();
add(textField);//文本框不可以换行,文本域可以换行
//监听这个文本框
MyActionListen2 myActionListen2 = new MyActionListen2();
//按下enter就会触发这个输入框的事件
textField.addActionListener(myActionListen2);
setVisible(true);
pack();
}
}
class MyActionListen2 implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
TextField field=(TextField) e.getSource();//获取一些资源,返回一个对象,强制转换
// e.getSource()的源码为:public Object getSource() ,强制转换
System.out.println(field.getText());//获得输入框的文本
}
运行结果:
增加一个隐私遮挡:
textField.setEchoChar('*');
运行结果为:
按下回车是时候文本框清空
field.setText("");
运行结果为:
简易计算器
拓展:组合大于继承
class A extends B{
//继承,A可以使用B里面所有特性
}
class A{
public B b;
//组合,此时A也可以直接继承B里面的特性
}
简易计算器组合方式即面向过程
public static void main(String[] args) {
//启动
new Calculator();
}
}
//计算器类
class Calculator extends Frame{
public Calculator(){
//3个文本框
TextField num1 = new TextField(10);//10代表最大输入个数
TextField num2 = new TextField(10);
TextField num3 = new TextField(20);
//一个按钮
Button button = new Button("=");
button.addActionListener(new CalculatorListener(num1,num2,num3));
//1个标签
Label label = new Label("+");
//流失布局
setLayout(new FlowLayout());
add(num1);
add(label);
add(num2);
add(button);
add(num3);
pack();
setVisible(true);
}
}
//监听类
class CalculatorListener implements ActionListener{
//利用构造器获取三个文本框里面的变量
private TextField num1,num2,num3;
public CalculatorListener(TextField num1,TextField num2,TextField num3){
this.num1=num1;
this.num2=num2;
this.num3=num3;
}
@Override
public void actionPerformed(ActionEvent actionEvent) {
//获得加数和被加数
//string类型转换为int类型
int n1 = Integer.parseInt(num1.getText());
int n2 = Integer.parseInt(num2.getText());
//进行加法运算后,把结果放到第三个框
num3.setText(""+(n1+n2));
//加法运算后,清除前两个框
num1.setText("");
num2.setText("");
}
运行结果为:
改进面向对象方法:
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);//10代表最大输入个数
num2 = new TextField(10);
num3 = new TextField(20);
Button button = new Button("=");
Label label = new Label("+");
//监听
button.addActionListener(new CalculatorListener(this));
//布局
setLayout(new FlowLayout());
add(num1);
add(label);
add(num2);
add(button);
add(num3);
pack();
setVisible(true);
}
}
//监听类
class CalculatorListener implements ActionListener{
//获取计算机这个对象,在一个类中组合另外一个类
Calculator calculator=null;
public CalculatorListener(Calculator calculator){
this.calculator=calculator;
}
@Override
public void actionPerformed(ActionEvent e) {
//1.获得加数和被加数
//string类型转换为int类型
//2.进行加法运算后,把结果放到第三个框
//3.加法运算后,清除前两个框
int n1 = Integer.parseInt(calculator.num1.getText());
int n2 = Integer.parseInt(calculator.num2.getText());
calculator.num3.setText(""+(n1+n2));
calculator.num1.setText("");
calculator.num2.setText("");
}
}
运行结果和上图相同
用内部类简化后代码:
//监听器直接放在计算器这个类里面
class Calculator extends Frame{
//属性
TextField num1,num2,num3;
//方法
public void loadFrame(){
//组件
num1 = new TextField(10);//10代表最大输入个数
num2 = new TextField(10);
num3 = new TextField(20);
Button button = new Button("=");
Label label = new Label("+");
//监听
button.addActionListener(new CalculatorListener());
//布局
setLayout(new FlowLayout());
add(num1);
add(label);
add(num2);
add(button);
add(num3);
pack();
setVisible(true);
}
//监听类
private class CalculatorListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
//1.获得加数和被加数
//string类型转换为int类型
//2.进行加法运算后,把结果放到第三个框
//3.加法运算后,清除前两个框
int n1 = Integer.parseInt(num1.getText());
int n2 = Integer.parseInt(num2.getText());
num3.setText(""+(n1+n2));
num1.setText("");
num2.setText("");
}
}
内部类的好处可以直接访问外部类的方法和属性
代码参考:com.shmily.lesson2