package test;
import java.awt.*;
import java.awt.event.*;
import java.awt.Graphics;public class AwtCalc extends Frame implements ActionListener
{  private Button[]    buttons = new Button[19];
  private String[]    buttonText = { " 1 " , " 2 ", " 3 ", " + ", " - ",
                                      " 4 ", " 5 ", " 6 ", " x ", " / ",
                                      " 7 ", " 8 ", " 9 ", "^ ", "sqrt",
                                      " C ", " 0 ", " . ", "    =    "};  private ETextField   result;       // 结果显示框
  private String      input = "";    // 用户的输入
  private Label       label;
  private Color       forecolor,     // 前景色
                      backcolor,      // 背景色
                      fieldcolor;     // 显示框颜色
  private Font        font,
                      buttonfont;
  private int         oper = 0,     // 记录运算过程中的运算符
                      oldoper = 0,
                      newoper = 0;
  private double      answer,
                      num1 = 0.0,
                      num2 = 0.0,
                      num3 = 0.0;
  private final int   ADD=1,        // 用于记录运算符的常量
                      SUB = 2,
                      MULT = 3,
                      DIVI = 4,
                      POW = 5,
                      SQRT = 6;
 private boolean      firstpress = true,  //是否按下第一个按键
                      morenums = false,      //是否多个数值被输入
                      equals = false,        //等于是否已经被按下
                      clearscreen = false,   //是否清屏
                      decnumber = false,     //是否输入一个浮点数
                      doubleclick = false;   //是否双击public AwtCalc(){
    super("计算器");    //初始化颜色
    buttonfont = new Font( "Courier", Font.PLAIN, 12 );
    setBackground( Color.lightGray );    result = new ETextField( 125, 18 );
    font = new Font( "宋体", Font.ITALIC, 10 );
    label = new Label( "结果" );
    label.setFont( font );
    result.setBackground( Color.white );
    setLayout( new FlowLayout() );    //初始化按钮
    Panel mainPanel=new Panel();
    mainPanel.setLayout(new GridLayout(5,1));
    for ( int i = 0; i < 19; i++ ) {
       buttons[i] = new Button( buttonText[i] );
       buttons[i].setFont( buttonfont );
       buttons[i].addActionListener( this );
    }    Panel panel1=new Panel();
    panel1.add( result );
    panel1.add( label );
    mainPanel.add(panel1);    Panel panel2=new Panel();
    panel2.add(buttons[0]);
    panel2.add(buttons[1]);
    panel2.add(buttons[2]);
    panel2.add(new Label( "  " ));
    panel2.add(buttons[3]);
    panel2.add(buttons[4]);
    mainPanel.add(panel2);    Panel panel3=new Panel();
    panel3.add(buttons[5]);
    panel3.add(buttons[6]);
    panel3.add(buttons[7]);
    panel3.add(new Label( "  " ));
    panel3.add(buttons[8]);
    panel3.add(buttons[9]);
    mainPanel.add(panel3);    Panel panel4=new Panel();
    panel4.add(buttons[10]);
    panel4.add(buttons[11]);
    panel4.add(buttons[12]);
    panel4.add(new Label( "  " ));
    panel4.add(buttons[13]);
    panel4.add(buttons[14]);
    mainPanel.add(panel4);    Panel panel5=new Panel();
    panel5.add(buttons[15]);
    panel5.add(buttons[16]);
    panel5.add(buttons[17]);
    panel5.add(new Label( "  " ));
    panel5.add(buttons[18]);
    mainPanel.add(panel5);    add("Center",mainPanel);
   buttons[15].setForeground( Color.red );
   resize(235,210);
   show();
}
//==============================================================================
// 处理按钮被按下时的动作,进行相应的处理
//==============================================================================
public void actionPerformed( ActionEvent e )
{  // 判断是否按下一个运算符键
  if (    e.getSource() != buttons[3] && e.getSource() != buttons[4]
       && e.getSource() != buttons[8] && e.getSource() != buttons[9]
       && e.getSource() != buttons[13] && e.getSource() != buttons[14]
       && e.getSource() != buttons[15] && e.getSource() != buttons[18] ) {
      //按下一个数字键
     if ( clearscreen ) {       // 在完成一次运算后再次按下运算符之前清屏
         clearScreen();
         clearscreen = false;
     }     if ( e.getSource() == buttons[0] ) {
        input += "1";                     // 输入为"1"
        result.setText( input );
        showAnswer( input );
     } // end else if     else if ( e.getSource() == buttons[1] ) {
        input += "2";                     // 输入为"2"
        showAnswer( input );
     } // end else if     else if ( e.getSource() == buttons[2] ) {
        input += "3";                     // 输入为"3"
        showAnswer( input );
     }  // end else if     else if ( e.getSource() == buttons[5] ) {
        input += "4";                     // 输入为"4"
       showAnswer( input );
     } // end else if     else if ( e.getSource() == buttons[6] ) {
        input += "5";                      // 输入为"5"
        showAnswer( input );
     }  // end if     else if ( e.getSource() == buttons[7] ) {
        input += "6";                      // 输入为"6"
        showAnswer( input );
     }  // end else if     else if ( e.getSource() == buttons[10] ) {
        input += "7";                      // 输入为"7"
        showAnswer( input );
     }  // end else if     else if ( e.getSource() == buttons[11] ) {
        input += "8";                      // 输入为"8"
        showAnswer( input );
     }  // end else if     else if ( e.getSource() == buttons[12] ) {
        input += "9";                      // 输入为"9"
        showAnswer( input );
     }  // end else if     else if ( e.getSource() == buttons[16] ) {
        input += "0";                      // 输入为"0"
        showAnswer( input );
     } // end else if     else if ( e.getSource() == buttons[17] ) {
       if ( decnumber == false ) {
            //设置输入为浮点数
            decnumber = true;
        input += ".0";                         // 输入为小数点
        showAnswer( input );
     }
    }
  } // end if

解决方案 »

  1.   

    // 检查是否按下加法按钮
      if ( e.getSource() == buttons[3] ) {
            clearscreen = false;
            decnumber = false;
            oper = ADD;                   // 将运算符设置为加
            clickCheck( input );          // 检查是否为双击运算符
          if ( doubleclick == false )
             processNumbers();            // 如果没有双击,继续处理
             input = "";                  // 记录输入值的变量清空
          }  // end  if  // 检查是否按下减法按钮
      else if (e.getSource() == buttons[4] ) {
          clearscreen = false;
          decnumber = false;
          oper = SUB;                    // 将运算符设置为减
          clickCheck( input );           // 检查是否为双击运算符
          if ( doubleclick == false )
            processNumbers();            // 如果没有双击,继续处理
            input = "";                  // 记录输入值的变量清空
          } // end else if  // 检查是否按下乘法按钮
      else if (e.getSource() == buttons[8] ) {
          clearscreen = false;
          decnumber = false;
          oper = MULT;                   // 将运算符设置为乘法
          clickCheck( input );           // 检查是否为双击运算符
          if ( doubleclick == false )
            processNumbers();            // 如果没有双击,继续处理
            input = "";                  // 记录输入值的变量清空
          } //end else if  // 检查是否按下除法按钮
      else if (e.getSource() == buttons[9] ) {
          clearscreen = false;
          decnumber = false;
          oper = DIVI;                   // 将运算符设置为除法
          clickCheck( input );           // 检查是否为双击运算符
          if ( doubleclick == false )
            processNumbers();            // 如果没有双击,继续处理
            input = "";                  // 记录输入值的变量清空
          }  // end else if  // 检查是否按下幂运算按钮
      else if ( e.getSource() == buttons[13] ) {
          clearscreen = false;
          decnumber = false;
          oper = POW;                    // 将运算符设置为幂
          clickCheck( input );           // 检查是否为双击运算符
          if ( doubleclick == false )
            processNumbers();            // 如果没有双击,继续处理
            input = "";                  // 记录输入值的变量清空
          }  // end else if  // 检查是否按下开方运算按钮
      else if ( e.getSource() == buttons[14] ) {
          clearscreen = false;
          oper = SQRT;                    // 将运算符设置为开方
          clickCheck( input );            // 检查是否为双击运算符
          if ( doubleclick == false )
            processNumbers();             // 如果没有双击,继续处理
            input = "";                   // 记录输入值的变量清空
          }  // end else if  // 检查是否按下清零按钮
      if (e.getSource() == buttons[15] ) {
           clearScreen();
          }  // end if  // 检查是否按下等于按钮
      if (e.getSource() == buttons[18] ) {
           equals = true;
           clearscreen = true;
           clickCheck( input );             //检查是否为双击运算符
         if ( doubleclick == false )
            processNumbers();                   //如果没有双击,继续处理
            input = Double.toString( answer );
        } // end if   }  // end actionPerformed()//==============================================================================
    //该方法处理用户的这种输入
    //==============================================================================
    public void processNumbers() {  // 判断运算符是否被第一次按下
      if ( firstpress ) {
         if ( equals ) {
            num1 = answer;     //结果被保存
            equals = false;   //等待另外的输入
         } // end if
        else
          num1 = Double.valueOf( input ).doubleValue();      oldoper =  oper;                  // 将当前运算符保存    // 如果进行开方运算
        if ( oper == SQRT ) {
          answer = calculate( oldoper, num1, 0.0 );
          showAnswer( Double.toString( answer ) );
          morenums = true;
        }
          firstpress = false;
      }  // end if  else if ( !morenums ) {      num2 = Double.valueOf( input ).doubleValue();
          answer = calculate( oldoper, num1, num2 );
          showAnswer( Double.toString( answer) );
          newoper = oper;      if ( !equals )
            morenums = true;                         //标识已经有至少两个数值被输入
          else {
            morenums = false;       //如果等号被按下, firstpress将被置为true
            firstpress = true;
        } // end else
        } // end if
        else if (morenums) {
           //输入多个数值
          if ( equals ) {
            newoper = oper;
            morenums = false;
            firstpress = true;
        } // end if      num3 = Double.valueOf( input ).doubleValue();
          answer = calculate( newoper, answer, num3 );
          showAnswer( Double.toString(answer) );      newoper = oper;
       }  // end else if
    }  // end processNumbers()//==============================================================================
    //该方法用于根据输入的数值或运算符进行计算
    //==============================================================================
    public double calculate( int oper, double number1, double number2 )
    {
       double answer = 0.0;        switch( oper ) {
              case ADD:
                answer = number1 + number2;
                break;
              case SUB:
                answer = number1 - number2;
                break;
              case MULT:
                answer = number1 * number2;
                break;
              case DIVI:
                answer = number1 / number2;
                break;
              case POW:
                answer = Math.pow( number1, number2 );
                break;
              case SQRT:
                answer = Math.sqrt( number1 );
                break;
          } // end switch     return answer;
      }  // end calculate()//==============================================================================
    //该方法用于将计算的结果输出到结果框中
    //==============================================================================
    public void showAnswer( String s )
    {
        double answer;    answer = Double.valueOf(s).doubleValue();
        if ( decnumber )
        result.setText( Double.toString(answer) );
        else
        result.setText( s );} // end showAnswer//==============================================================================
    //该方法检查是否双击运算符
    //==============================================================================
    public boolean clickCheck( String s ) {
      if ( s == "" )
        doubleclick = true;
      else
        doubleclick = false;  return doubleclick;
    }//==============================================================================
    //清屏
    //==============================================================================
    public void clearScreen()
    {
            oper = 0;                    // 初始化各个变量
            input = "";
            answer = 0;
            decnumber = false;
            morenums = false;
            firstpress = true;
            equals = false;
            showAnswer( Integer.toString( (int)answer) );
    }public void paint( Graphics g )
    {
        //绘制边界
        g.drawRect( 0, 0, size().width - 1, size().height - 1 );
        g.drawLine( 0, 0, 0, size().height );
    }
    public static void main(String[] args){     AwtCalc ca=new AwtCalc();
      }
    } // end program
      

  2.   

    package test;import java.awt.*;public class ETextField extends Canvas {    String message = "";
        boolean firstTime = true;
        int x;public ETextField( int width, int height )
    {
        setSize( width, height );
    }    /** Creates new ETextField */
    public void setText( String text )
    {
       firstTime = false;
       message = text;
       x+=3;
       repaint();
    }public void paint( Graphics g ) {   g.drawRect( 0, 0, size().width-1, size().height-1 );
       g.drawString( message, 3, 13 );}
    }