package whh;
import java.awt.*;
import java.awt.event.*;class EventTest extends Frame implements ActionListener,ItemListener
{
Button btn1[]=new Button[16];
Button btn2[]=new Button[16];
TextField text;
String a1="",a2="",b1="",b2="",b3="",x;
CheckboxGroup cbg=new CheckboxGroup();
Checkbox c1,c2,c3;
EventTest()
    {
    setTitle("计算器");
    setLayout(null);
    setSize(500,250);
    setLocation(400,200);
this.setResizable(false);
    text=new TextField("0",6);
    text.setEditable(false);
Panel pnl=new Panel(new GridLayout(4,4,7,7));
Panel pnl2=new Panel(new GridLayout(1,4,7,7));
Panel pnl3=new Panel(new GridLayout(1,4,7,7));
Panel pnl4=new Panel(new GridLayout(1,4,7,7));
Panel pnl5=new Panel(new GridLayout(1,4,7,7));
Panel pnl6=new Panel(new GridLayout(4,4,7,7));
for(int i=0;i<=9;i++)
{
btn1[i]=new Button(String.valueOf(i));
}
     
 btn1[10]=new Button("+");
         btn1[10].setForeground(Color.red);
 btn1[11]=new Button("-");
 btn1[11].setForeground(Color.red);
 btn1[12]=new Button("*");
 btn1[12].setForeground(Color.red);
 btn1[13]=new Button("/");
 btn1[13].setForeground(Color.red);
 btn1[14]=new Button("C");
 btn1[14].setForeground(Color.red);
 btn1[15]=new Button("=");
 btn1[15].setForeground(Color.red);
 btn2[0]=new Button("Sin");
 btn2[1]=new Button("And");
 btn2[2]=new Button("(");
 btn2[3]=new Button(")");
 btn2[4]=new Button("Cos");
 btn2[5]=new Button("Or");
 btn2[6]=new Button("Exp");
 btn2[7]=new Button("Ln");
 btn2[8]=new Button("Tan");
 btn2[9]=new Button("Xo");
 btn2[10]=new Button("x*y");
 btn2[11]=new Button("Log");
 btn2[12]=new Button("e");
 btn2[13]=new Button("Not");
 btn2[14]=new Button("x*3");
 btn2[15]=new Button("n!");
 for(int i=0;i<=15;i++)
 {
 btn2[i].disable();
 }

 c1=new Checkbox("十进制",cbg,true);
 c2=new Checkbox("八进制",cbg,false);
     c3=new Checkbox("二进制",cbg,false);
this.setLayout(null);
pnl.setBounds(260,90,240,160);
pnl2.setBounds(0, 70, 240, 20);
pnl3.setBounds(260, 70, 240, 20);
pnl4.setBounds(0, 30, 500, 20);
pnl5.setBounds(50, 50, 400, 20);
pnl6.setBounds(0,90,240,160);
    
for (int i=0;i<=15;i++)
{
pnl.add(btn1[i]);
}

pnl2.add(c1);
pnl2.add(c2);
pnl2.add(c3);
pnl3.add(new Checkbox("Inv"));
pnl3.add(new Checkbox("Hyp"));
pnl5.add(text);
        for(int i=0;i<=15;i++)
        {
         pnl6.add(btn2[i]);
        }

this.add(pnl);
this.add(pnl2);
this.add(pnl3);
this.add(pnl4);
this.add(pnl5);
this.add(pnl6);

for(int i=0;i<=15;i++)
{
btn1[i].addActionListener(this);// 注册监听器
}

c1.addItemListener(this); 
c2.addItemListener(this); 
c3.addItemListener(this); 
      
    //关闭窗口
    addWindowListener(new WindowAdapter()
    {
public void windowClosing(WindowEvent e)
{
       System.exit(0);        
       }
});
    setVisible(true);
    }
public void itemStateChanged(ItemEvent e)
{
if(c1.getState()==true)           
{
for(int i=0;i<=9;i++)
{
btn1[i].enable();
}
}
if(c2.getState()==true)           
{
btn1[8].disable();
btn1[9].disable();
}
if(c3.getState()==true)           
{
for(int i=2;i<=9;i++)
{
btn1[i].disable();
}
}
}
    
    public void actionPerformed(ActionEvent e)
    {
        //取得事件源对象
        Button btn=(Button) e.getSource(); 
        
        if(btn==btn1[0])  // 如果是按下btn1按钮   
        {
         a1=btn1[0].getLabel();
            b1=b1+a1;
            text.setText(b1);
           
        }
        if(btn==btn1[1])
        {
         a1=btn1[1].getLabel();
            b1=b1+a1;
            text.setText(b1);
           
        }
        if(btn==btn1[2])     
        {
         a1=btn1[2].getLabel();
            b1=b1+a1;
            text.setText(b1);
            
        }
        if(btn==btn1[3])     
        {
        a1=btn1[3].getLabel();
            b1=b1+a1;
            text.setText(b1);
           
        }
        if(btn==btn1[4])     
        {
        a1=btn1[4].getLabel();
            b1=b1+a1;
            text.setText(b1);
           
        }
        if(btn==btn1[5])     
        {
        a1=btn1[5].getLabel();
            b1=b1+a1;
            text.setText(b1);
            
        }
        if(btn==btn1[6])     
        {
        a1=btn1[6].getLabel();
            b1=b1+a1;
            text.setText(b1);
         
        }
        if(btn==btn1[7])     
        {
        a1=btn1[7].getLabel();
            b1=b1+a1;
            text.setText(b1);
           
        }
        if(btn==btn1[8])     
        {
        a1=btn1[8].getLabel();
            b1=b1+a1;
            text.setText(b1);
           
        }
        if(btn==btn1[9])     
        {
        a1=btn1[9].getLabel();
            b1=b1+a1;
            text.setText(b1);
           
        }
        if(btn==btn1[10])     
        {
        b3=text.getText();
        b1="";
        x=btn1[10].getLabel();
       
        }
        if(btn==btn1[11])     
        {
        b3=text.getText();
        b1="";
        x=btn1[11].getLabel();
        }
        if(btn==btn1[12])     
        {
        b3=text.getText();
        b1="";
        x=btn1[12].getLabel();
        }
        if(btn==btn1[13])     
        {
        b3=text.getText();
        b1="";
        x=btn1[13].getLabel();
        }
     if(btn==btn1[14])     
        {
        b1="";
        text.setText("0");        }
        if(btn==btn1[15])     
        {
        b2=text.getText();
          b1="";
        if(x=="+")
        {
        float c =  Float.parseFloat(b3)+ Float.parseFloat(b2);
        text.setText(String.valueOf(c));
        }
        if(x=="-")
        {
       float c =  Float.parseFloat(b3)- Float.parseFloat(b2);
        text.setText(String.valueOf(c));
        }
        if(x=="*")
        {
       float c =  Float.parseFloat(b3)* Float.parseFloat(b2);
        text.setText(String.valueOf(c));
        }
        if(x=="/")
        {
       float c = Float.parseFloat(b3)/Float.parseFloat(b2);
        text.setText(String.valueOf(c));
        }
       
        }
       
       
       
    }
    
    public static void main(String args[])
{  
    EventTest frm=new EventTest(); 
    
}  
}代码如上 就是我再按一下“=”这个按钮的时候 的出的结果不对  其他运算也一样只能运算一次不能再一次运算以后 连续按等号
帮帮修改一下 
或者 有什么算法说一下 最好详细一点 
谢谢了 
还有 什么不好的地方请指出 
不胜感激涕零啊

解决方案 »

  1.   

    这个计算器就看你要不要做成复杂的了
    简单的,等号就一次有用,连按就不做处理
    另外你要做复杂的话,那就大了去了,还包括连按运算符、1+2之后不按等号再按其他运算符等等
    我看你做这个的目的是熟悉AWT编程而不是去刻意的做一个计算器,那么做到了解流程就已经足够了,你说呢?
      

  2.   

    我给你一个你自己看看好吗?
    public class Calculator{ 
    private String result = "0"; 
    private int op = 0,add = 1,sub = 2,mul = 3,div = 4; private double stringToDouble(String x){ 
    double y = Double.parseDouble(x); 
    return y; 

    private void operate(String x){ 
    double x1 = stringToDouble(x); 
    double y = stringToDouble(result); 
    switch (op){ 
    case 0: 
    result = x; 
    break; 
    case 1: 
    result = String.valueOf(y+x1); 
    break; 
    case 2: 
    result = String.valueOf(y-x1); 
    break; 
    case 3: 
    result = String.valueOf(y*x1); 
    break; 
    case 4: 
    if(x1!=0){ 
    result = String.valueOf(y/x1); 
    }else{ 
    result = "The divisor can't be zero!"; 

    break; 

    } public String opAdd(String x){ 
    operate(x); 
    op = add; 
    return result; 

    public String opSubtract(String x){ 
    operate(x); 
    op = sub; 
    return result; 

    public String opMultiply(String x){ 
    operate(x); 
    op = mul; 
    return result; 

    public String opDivide(String x){ 
    operate(x); 
    op = div; 
    return result; 

    public String opEquals(String x){ 
    operate(x); 
    op = 0; 
    return result; 

    public void opClean(){ 
    op = 0; 
    result = "0"; 

    }
    //////////CalculatorGUI///////////////////////
    import java.awt.*; 
    import java.awt.event.*; 
    import java.util.EventObject; public class CalculatorGUI{ 
    private Frame f; 
    private Panel p1,p2; 
    private Button b0,b1,b2,b3,b4,b5,b6,b7,b8,b9; 
    private Button bPoint,bAdd,bDec,bMul,bDiv,bCal; 
    private TextField tf; 
    private String s,op; 
    private Calculator cal = new Calculator(); 
    private boolean ifOp; public CalculatorGUI(){ 
    f = new Frame("Calculator"); 
    p1 = new Panel(); 
    p2 = new Panel(); b0 = new Button("0"); 
    b1 = new Button("1"); 
    b2 = new Button("2"); 
    b3 = new Button("3"); 
    b4 = new Button("4"); 
    b5 = new Button("5"); 
    b6 = new Button("6"); 
    b7 = new Button("7"); 
    b8 = new Button("8"); 
    b9 = new Button("9"); 
    bPoint = new Button("."); 
    bAdd = new Button("+"); 
    bDec = new Button("-"); 
    bMul = new Button("*"); 
    bDiv = new Button("/"); 
    bCal = new Button("="); tf = new TextField(25); 
    tf.setEditable(false); 
    } public void launchFrame(){ 
    f.setSize(220,160); 
    f.setResizable(false); 
    f.addWindowListener(new myWindowListener()); 
    p1.setLayout(new FlowLayout(FlowLayout.CENTER)); 
    p1.add(tf); 
    f.add(p1,BorderLayout.NORTH); 
    p2.setLayout(new GridLayout(4,4)); b0.addActionListener(new setLabelText_ActionListener()); 
    b1.addActionListener(new setLabelText_ActionListener()); 
    b2.addActionListener(new setLabelText_ActionListener()); 
    b3.addActionListener(new setLabelText_ActionListener()); 
    b4.addActionListener(new setLabelText_ActionListener()); 
    b5.addActionListener(new setLabelText_ActionListener()); 
    b6.addActionListener(new setLabelText_ActionListener()); 
    b7.addActionListener(new setLabelText_ActionListener()); 
    b8.addActionListener(new setLabelText_ActionListener()); 
    b9.addActionListener(new setLabelText_ActionListener()); 
    bPoint.addActionListener(new setLabelText_ActionListener()); 
    bAdd.addActionListener(new setOperator_ActionListener()); 
    bDec.addActionListener(new setOperator_ActionListener()); 
    bMul.addActionListener(new setOperator_ActionListener()); 
    bDiv.addActionListener(new setOperator_ActionListener()); 
    bCal.addActionListener(new setOperator_ActionListener()); p2.add(b7); 
    p2.add(b8); 
    p2.add(b9); 
    p2.add(bAdd); 
    p2.add(b4); 
    p2.add(b5); 
    p2.add(b6); 
    p2.add(bDec); 
    p2.add(b1); 
    p2.add(b2); 
    p2.add(b3); 
    p2.add(bMul); 
    p2.add(b0); 
    p2.add(bPoint); 
    p2.add(bCal); 
    p2.add(bDiv); 
    f.add(p2,BorderLayout.SOUTH); 
    f.setVisible(true); 
    } public void setTextFieldText_Temp(){ 
    if (tf.getText().length()<15 && (tf.getText().indexOf(".")==-1 || !s.equals("."))){ 
    tf.setText(tf.getText()+s); 
    }else{ 
    tf.setText((tf.getText()+s).substring(0,15)); 


    public void setTextFieldText(){ 
    if(ifOp){ 
    ifOp = false; 
    tf.setText(""); 
    setTextFieldText_Temp(); 
    }else{ 
    setTextFieldText_Temp(); 

    } public static void main(String[] args){ 
    CalculatorGUI calculator = new CalculatorGUI(); 
    calculator.launchFrame(); 
    } class myWindowListener extends WindowAdapter{ 
    public void windowClosing(WindowEvent e){ 
    System.exit(0); 

    } class setLabelText_ActionListener implements ActionListener{ 
    public void actionPerformed(ActionEvent e){ 
    Button tempB = (Button)e.getSource(); 
    s = tempB.getLabel(); 
    setTextFieldText(); 

    } class setOperator_ActionListener implements ActionListener{ 
    public void actionPerformed(ActionEvent e){ 
    Button tempB = (Button)e.getSource(); 
    op = tempB.getLabel(); 
    if(op.equals("+")){ 
    tf.setText(cal.opAdd(tf.getText())); 
    ifOp = true; 
    }else if(op.equals("-")){ 
    tf.setText(cal.opSubtract(tf.getText())); 
    ifOp = true; 
    }else if(op.equals("*")){ 
    tf.setText(cal.opMultiply(tf.getText())); 
    ifOp = true; 
    }else if(op.equals("/")){ 
    tf.setText(cal.opDivide(tf.getText())); 
    ifOp = true; 
    }else if(op.equals("=")){ 
    tf.setText(cal.opEquals(tf.getText())); 
    ifOp = true; 



    }
    我自己从前搞的,基本上的是O(n) 
      

  3.   

    你的读取方式的问题,我估计你想实现2进制,所以以检查每个字符的方式去读取, 然后计算比较容易出错,看一下源代码,你可以找到直接转换的方式 例:2 进制 int number=Integer.reverseBytes(binary)+2; 临睡前发的,没有太仔细看,不过我估计是这样的,
    还有当你选择以二进制计算的时候,当前的值,应该可以转换成进制出现
      

  4.   

    老师说要做个计算器 要实现我说的功能 需要数据结构 但是我们没教过java的数据结构  只是教过C语言的数据结构 不知道一样不一样  
    现在我弄不明白的就是在按下 等号 的时候 怎么把第二个数存起来 在下一次按等号的时候这个数不会变 我使用b2=text.getText(); 
    这个语句来实现的  不知道有没哟其他的方法
      

  5.   

    你为什么要使用folat ?,我修复了他, 你看一下,你把这段加到 = 中 
        if(btn==btn1[15])   
          {
          b2=text.getText();
          b1="";
          if(x=="+")
          {
          double c =  Double.parseDouble(b3)+ Double.parseDouble(b2);
          text.setText(String.valueOf(c));
          }
          if(x=="-")
          {
              double c =  Double.parseDouble(b3)-Double.parseDouble(b2);
          text.setText(String.valueOf(c));
          }
          if(x=="*")
          {
            double c =  Double.parseDouble(b3)*Double.parseDouble(b2);
          text.setText(String.valueOf(c));
          }
          if(x=="/")
          {
          double c =  Double.parseDouble(b3)/Double.parseDouble(b2);
          text.setText(String.valueOf(c));
          }
         
          }
      

  6.   

    数据结构只是一个概念,包含不同的运算,基本的思想相同,c 和 java 应用不同。 
      

  7.   

    对不起,发错了
      if(btn==btn1[15])   
          {
        
          b2=text.getText();
          b1="";
          if(x=="+")
          {
          double c =  Double.parseDouble(b3)+ Double.parseDouble(b2);
          text.setText(String.valueOf(c));
          }
          if(x=="-")
          {
              double c =  Double.parseDouble(b3)-Double.parseDouble(b2);
          text.setText(String.valueOf(c));
          }
          if(x=="*")
          {
            double c =  Double.parseDouble(b3)*Double.parseDouble(b2);
          text.setText(String.valueOf(c));
          }
          if(x=="/")
          {
          double c =  Double.parseDouble(b3)/Double.parseDouble(b2);
          text.setText(String.valueOf(c));
          }
          if(x=="=")
           {
                 text.setText(b2);
            }
              x=btn1[15].getLabel();
          }