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