简易计算器,组合 + 内部类回顾

输入框监听事件

package GUI;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TextFiledDemon {
    public static void main(String[] args) {
        // 启动!
        MyFrame myFrame = new MyFrame();
    }
}

class MyFrame extends Frame { // 继承Frame
    public MyFrame(){
        TextField textField = new TextField();
        add(textField);
        // 监听这个文本框输入的文字
        MyActionListener myActionListener = new MyActionListener();
        // 按下回车就会触发这个事件
        textField.addActionListener(myActionListener);

        setVisible(true);
        pack();
    }
}

class MyActionListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        //e.getSource(); // 获得一些资源, 返回一个对象(Object类):因此要下转型:监听了谁就是谁
        TextField field = (TextField) e.getSource();

        System.out.println(field.getText()); // 获得输入框的文本

        field.setText(""); // 清空
    }
}

简易计算器,组合 + 内部类回顾

OOP原则:组合 大于 继承

尽量别用多态,别用继承

面向过程

package GUI;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

// 简易计算器
public class TextCalc {
    public static void main(String[] args) {
        // 启动!
        Calculator calculator = new Calculator();
    }
}

// 计算器类
class Calculator extends Frame {
    public Calculator(){
        // 3 三个文本框
        TextField num1 = new TextField(10); // 框的大小:字符数
        TextField num2 = new TextField(10);
        TextField num3 = new TextField(20);
        // 1个按钮
        Button button = new Button("=");

        // 给按钮绑定一个加法事件!
        button.addActionListener(new MyCalculatorListener(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 MyCalculatorListener implements ActionListener {

    //  获取三个变量(String类型)
    private TextField num1 ,num2, num3;

    public MyCalculatorListener(TextField num1, TextField num2, TextField num3) {
        this.num1 = num1;
        this.num2 = num2;
        this.num3 = num3;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        //1. 获得加数 跟 被加数
        int n1 = Integer.parseInt(num1.getText()); // Integer.parseInt()将字符串转为整数类型
        int n2 = Integer.parseInt(num2.getText());
        //2. 加法运算后 将这个值传到第三个框 setText()
        num3.setText("" + (n1 + n2)); // 加后转为字符串!
        //3. 清除前两个框
        num1.setText("");
        num2.setText("");
    }
}

**01改进:面向对象——组合!

package GUI;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

// 简易计算器
public class TextCalc {
    public static void main(String[] args) {
        // 启动!
        Calculator calculator = new Calculator();
        calculator.loadFrame();
    }
}

// 计算器类
class Calculator extends Frame {

    // 属性
    TextField num1, num2, num3;
    Button button;
    Label label1;
    // 方法
    public void loadFrame(){ // 省去了构造器!
        // 组件
        num1 = new TextField(10); // 框的大小:字符数
        num2 = new TextField(10);
        num3 = new TextField(20);
        button = new Button("=");
        label1 = new Label("+");

        // 给按钮绑定一个加法事件!
        // 获取的是对象而不是数据!
        button.addActionListener(new MyCalculatorListener(this)); // 把自己这个对象丢进去

        // 布局
        setLayout(new FlowLayout());
        
        // 组件拼接
        add(num1);
        add(label1);
        add(num2);
        add(button);
        add(num3);
        
        pack();
        setVisible(true);
    }

}
// 监听器类 —— 我们获取到一个计算器对象
// 改用组合 完全面向对象
// 操作: 对象.属性 / 对象.方法
class MyCalculatorListener implements ActionListener {

    // 获取计算器这个对象,在一个类中组合另外一个类!
    Calculator calculator = null;

    // 构造方法
    public MyCalculatorListener(Calculator calculator) { // 计算器类里面有num1 num2 num3了!
        this.calculator = calculator;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        //1. 获得加数 跟 被加数
        //2. 加法运算后 将这个值传到第三个框 setText()
        //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("");


    }
}

**02改进:面向对象——内部类!

内部类:更好的包装!

内部类最大的好处,就是可以畅通无阻的访问外部属性和方法!

package GUI;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

// 简易计算器
public class TextCalc {
    public static void main(String[] args) {
        // 启动!
        Calculator calculator = new Calculator();
        calculator.loadFrame();
    }
}

// 计算器类
class Calculator extends Frame {

    // 属性
    TextField num1, num2, num3;
    Button button;
    Label label1;
    // 方法
    public void loadFrame(){ // 省去了构造器!
        // 组件
        num1 = new TextField(10); // 框的大小:字符数
        num2 = new TextField(10);
        num3 = new TextField(20);
        button = new Button("=");
        label1 = new Label("+");

        // 给按钮绑定一个计算器操作事件!
        button.addActionListener(new MyCalculatorListener()); // 直接new一个监听器!

        // 布局
        setLayout(new FlowLayout());

        // 组件拼接
        add(num1);
        add(label1);
        add(num2);
        add(button);
        add(num3);

        pack();
        setVisible(true);
    }

    // 监听器类(对监听器类进行封装到计算器类中)这样就不用再另外进行组装了(计数器类这个类直接使用监听器类)

    // 内部类最大的好处,就是可以畅通无阻的访问外部属性和方法!

    // 要是写在外面还要另外进行组合写代码 ———— 减少了代码!
    private class MyCalculatorListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            //1. 获得加数 跟 被加数
            //2. 加法运算后 将这个值传到第三个框 setText()
            //3. 清除前两个框
            int n1 = Integer.parseInt(num1.getText());
            int n2 = Integer.parseInt(num2.getText());
            num3.setText("" + (n1 + n2));
            num1.setText("");
            num2.setText("");

        }
    }

}

posted @ 2021-11-28 22:55  时间最考验人  阅读(65)  评论(0编辑  收藏  举报