GUI(简易计算,组合+内部类)


OOP原则:组合大于继承
继承:
class Aextends B{

}
组合:
class A{
public B b;//把B创建进来也可以调用内部的全部方法,而且不会产生过多的耦合
}

简易计算器 :

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Scanner;
//启动类
public class main {
    public static void main(String[] args) {
        Calculator calc=new Calculator();
    }
}

//计算器类
class Calculator extends Frame {
 public Calculator(){
        //三个文本框
        TextField field1=new TextField(10);//最大填写的字符数为10
        TextField field2=new TextField(10);//最大填写的字符数为10
        TextField field3=new TextField(20);//最大填写的字符数为10
        //一个按钮
        Button button=new Button("=");//创建一个名为=的按钮
        //为按钮添加事件,MyCalculatorListener:监听事件类,并传入三个文本框参数,当这三个文本框输入参数后,那监听类中的构造器默认就有这三个参数
        button.addActionListener(new MyCalculatorListener(field1,field2,field3));

        //一个标签
        Label lable=new Label("+");//创建一个名字+的标签,只是一个+号,什么都没有
        //布局
        setLayout(new FlowLayout());//使用流式布局
        //按顺序把文本框、按钮、标签添加到窗体中
        add(field1);//文本框
        add(lable);//+
        add(field2);//文本框
        add(button);//=
        add(field3);
        //自动化最优布局
        pack();
        //窗体可见
        setVisible(true);
        //调用关闭窗体方法
        setWincso();
    }
    //关闭窗体
    public void setWincso(){
    addWindowListener(new WindowAdapter() {
         @Override
         public void windowClosing(WindowEvent e) {
             System.exit(0);
         }
     });

    }
}
//监听器类
class MyCalculatorListener implements ActionListener {
    //获取文本框的三个变量,
    private TextField field1,field2,field3;
    //创建有参构造让传的文本框变量等于本地的变量
    public MyCalculatorListener(TextField field1,TextField field2,TextField field3){
        this.field1=field1;
        this.field2=field2;
        this.field3=field3;

    }
    public void actionPerformed(ActionEvent e){
        //1.获得加数和被加数,getText():这个获取的值是一个String类型,那我们要把他转int类型,所以要用int的包装类(Integer)去转
        int f1= Integer.parseInt(field1 .getText());//parseInt:转换成int类型的方法
        int f2= Integer.parseInt(field2 .getText());
        System.out.println(f1);
        System.out.println(f2);
        //2.将这个值加法运算后,放到第三个框
        field3.setText(""+(f1+f2));//因为要传入一个string类型,所以把拼接方式转成string类型
        //3.清除前两个框的内容
        field1.setText("");
        field2.setText("");
    }
}

使用组合(面向对象方式)优化上面的代码:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Scanner;
//启动类
public class main {
    public static void main(String[] args) {
        new Calculator().LKd();
    }
}

//计算器类
class Calculator extends Frame{
    //把属性声明为成员属性
    TextField field1;
    TextField field2;
    TextField field3;
    //创建一个方法,然后用类调用
    public void LKd(){
        //用上面声明好的成员文本框,来创建对应长度的文本框
        field1=new TextField(10);
        field2=new TextField(10);
        field3=new TextField(20);
        //创建名为“=”的按钮
        Button button=new Button("=");
        //为按钮添加事件
        button.addActionListener(new MyCalculatorListener(this));//this:谁调用他,就把谁传进去
        //创建按钮
        Label lable=new Label("+");
        add(field1);//文本框
        add(lable);//+
        add(field2);//文本框
        add(button);//=
        add(field3);


        //设置流式布局
        setLayout(new FlowLayout());
        //自动化最优布局
        pack();
        //窗体可见
        setVisible(true);
        //调用关闭创建方法
        setWincso();
    }
    //创建关闭窗体方法
    public void setWincso(){
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}
//监听器类
class MyCalculatorListener implements ActionListener{
    //创建组合类的属性
    Calculator ca=null;

    public MyCalculatorListener(Calculator ca){
        this.ca=ca;

    }
    public void actionPerformed(ActionEvent e){
        int f1= Integer.parseInt(ca.field1 .getText());
        int f2= Integer.parseInt(ca.field2 .getText());

        ca.field3.setText(""+(f1+f2));

        ca.field1.setText("");
        ca.field2.setText("");
    }
}

 使用内部类方式优化上面的代码:更好的包装,上面两个代码,需要第三方类去辅助,使用内部类的话会比较方法

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Scanner;
//启动类
public class Main {
    public static void main(String[] args) {
        new Calculator().LKd();
    }
}

//计算器类
class Calculator extends Frame{
    //把属性声明为成员属性
    TextField field1;
    TextField field2;
    TextField field3;
    //创建一个方法,然后用类调用
    public void LKd(){
        //用上面声明好的成员文本框,来创建对应长度的文本框
        field1=new TextField(10);
        field2=new TextField(10);
        field3=new TextField(20);
        //创建名为“=”的按钮
        Button button=new Button("=");
        //为按钮添加事件
        button.addActionListener(new MyCalculatorListener());//因为使用了内部类方式简化了监听器类的代码,所以在使用监听器类时,直接new一个监听器就可以了
        Label lable=new Label("+");
        add(field1);//文本框
        add(lable);//+
        add(field2);//文本框
        add(button);//=
        add(field3);


        //设置流式布局
        setLayout(new FlowLayout());
        //自动化最优布局
        pack();
        //窗体可见
        setVisible(true);
        //调用关闭创建方法
        setWincso();
    }
    //创建关闭窗体方法
    public void setWincso(){
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
    
//监听器类放在了计算器类的里面
//内部类最大的好处,就是可以畅通无阻的访问外部类的属性和方法
private class MyCalculatorListener implements ActionListener{
  

    public void actionPerformed(ActionEvent e){
        int f1= Integer.parseInt(field1 .getText());
        int f2= Integer.parseInt(field2 .getText());

        field3.setText(""+(f1+f2));

        field1.setText("");
        field2.setText("");
    }
}
}

相关