日期:2014-05-20 浏览次数:20847 次
package com.zhyx.swing; import java.awt.BorderLayout; import java.awt.Button; import java.awt.Color; import java.awt.GridLayout; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; /** * 计算器功能实现类 * @author zhyx */ public class TestCalculator extends JFrame { /** * TestCalculator初始化方法 */ public TextField t1; public JButton btn[]= new JButton[17];; public TestCalculator() { setLayout(new BorderLayout()); JPanel p1=new JPanel(); t1=new TextField(); JPanel p2=new JPanel(); p2.setLayout(new GridLayout(4,4)); String []text={"7","8","9","/","4","5","6","*","1","2","3","-","0","+/-",".","+","="}; int i; for(i=0;i<btn.length;i++){ btn[i]=new JButton(text[i]); p2.add(btn[i]); btn[i].addActionListener(new Listener(this)); //持有外部类的引用 } btn[0].setSize(20,30); p1.setSize(300,10); p1.setBackground(Color.gray); p2.setSize(500,30); t1.setBackground(Color.RED); t1.setText("0."); add(p1,BorderLayout.NORTH); add(t1,BorderLayout.CENTER); add(p2,BorderLayout.SOUTH); setDefaultCloseOperation(EXIT_ON_CLOSE); pack(); setVisible(true); } /** * @param args */ public static void main(String[] args) { TestCalculator test=new TestCalculator(); } //Button在之前定义的是数组类型,传到的是Button类型是否也可以 } class Listener implements ActionListener{ private String lastop; //存储上一操作符 private String thisnum; //存储新输入的值 private String totalnum; public Listener(){ } //获得外部类的t1参数方法2:持有外部类的引用 TestCalculator tc; public Listener(TestCalculator tc){ this.tc=tc; } public void actionPerformed(ActionEvent e) { Object obj = e.getSource(); String gl=((JButton) obj).getText(); // TextField t1=null // 应该得到TestCalculator类中的t1,初始化后会不会显示结果,所以不能这样写 //获得外部类的变量这种方法不成,T1传过来的值会为空值 // TextField t1=new TextField(); if(obj instanceof JButton){ //如果按钮里的String内容为int型,则返回到text上 try{ //判断是否为数字 if(Character.isDigit(gl.charAt(0))){ int a=Integer.parseInt(((JButton) obj).getText()); tc.t1.setText(""+a); totalnum=tc.t1.getText(); }else{//对于操作符的操作 calulateByOpretor(gl); } }catch(Exception e1){ //lastop=gl; 在此处建立传入的操作符和前一个操作符赋值是不正确的 e1.printStackTrace(); } } //每一次点击完按钮后Text上的内容要清空 // t1.setText(""); } private void calulateByOpretor(String op){ //改为传入操作符参数的做法 if(! op.equals("=")){ lastop=op; //对前一个操作符赋值 }else if{lastop!=null && "=".equals(op)){ //到等号时,前面的加号为null了,怎么回事 oprateByOp(lastop); } } public void oprateByOp(String op){ if("+".equals(op)){ totalnum+=thisnum; tc.t1.setText(totalnum); } } }