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(""); } } }