1 import java.awt.BorderLayout; 2 import java.awt.Button; 3 import java.awt.Color; 4 import java.awt.Dimension; 5 import java.awt.Frame; 6 import java.awt.GridLayout; 7 import java.awt.Panel; 8 import java.awt.TextField; 9 import java.awt.event.ActionEvent; 10 import java.awt.event.ActionListener; 11 import java.awt.event.MouseEvent; 12 import java.awt.event.MouseListener; 13 14 public class Calculator extends Frame implements ActionListener,MouseListener { 15 /** 16 * button上的名字 17 */ 18 private final String KEY[] = {"7","8" ,"9" ,"/" ,"4" ,"5" ,"6" ,"*" ,"1" ,"2" ,"3" ,"-" ,"0" ,"." ,"C" ,"+" ,"+/-" ,"%" ,"←" ,"=" }; 19 /** 20 * 创建一个button数组 21 */ 22 private Button key[] = new Button[ KEY. length]; 23 24 /** 25 * 计算结果的文本框 26 */ 27 private TextField tf = new TextField( "0"); 28 /** 标志用户按的是否是整个表达式的第一个数字,或者是运算符后的第一个数字*/ 29 private boolean firstNum = true; 30 /**计算的中间结果。*/ 31 private double resultNum = 0.0; 32 /**当前运算的运算符*/ 33 private String operator = "="; 34 /**操作是否合法*/ 35 private boolean operateValidFlag = true; 36 37 38 39 /** 40 * 创建布局以及添加组件 41 */ 42 public void additionLayout(){ 43 //构造一个有标题的构造方法 44 Frame f = new Frame( "计算器"); 45 //定义一个窗口事件监听器用于关闭窗口 46 f.addWindowListener( new MyWindowListener()); 47 //放button的面板 48 Panel p = new Panel(); 49 Panel p2 = new Panel(); 50 //定义panel的布局方式 51 p.setLayout( new GridLayout(5,4,5,5)); 52 p2.setLayout( new GridLayout(1,1,5,5)); 53 //使文本框不可编辑 54 tf.setEditable( false); 55 56 //用for循环创建button并加入到面板中 57 for( int i = 0;i< KEY. length;i++){ 58 key[i] = new Button( KEY[i]); 59 key[i].setBackground(Color. cyan); 60 p.add( key[i]); 61 } 62 //为所有的button注册事件监听器 63 for ( int i = 0; i < KEY. length; i++) { 64 key[i].addActionListener( this); 65 key[i].addMouseListener( this); 66 } 67 tf.setPreferredSize( new Dimension(20,30)); 68 p2.add( tf); 69 f.add(p,BorderLayout. CENTER); 70 f.add(p2,BorderLayout. NORTH); 71 f.setSize(333,235); //设置窗口大小 72 f.setLocation(550, 200); //设置窗口的初始位置 73 f.setResizable( false); //不可改变窗口大小 74 f.setVisible( true); //设置窗口可见 75 } 76 77 /** 78 * 监听器处理事件 79 */ 80 @Override 81 public void actionPerformed(ActionEvent e) { 82 String label = e.getActionCommand(); 83 if( "0123456789.".indexOf(label)>=0){ 84 //用户按了数字键 85 handleNumber(label); 86 } else if(label.equals( KEY[14])){ 87 //用户按了C键 88 handleC(); 89 } else if (label.equals( KEY[18])) { 90 // 用户按了"Backspace"键 91 handleBackspace(); 92 } else{ 93 //用户按了运算符键 94 handleOperator(label); 95 } 96 } 97 /** 98 * 处理数字键与小数点被按下的事件 99 * 100 */ 101 private void handleNumber(String num){ 102 if( firstNum){ 103 //输入第一个数字 104 tf.setText(num); 105 } else if((num.equals( ".")) && (tf.getText().indexOf( ".") < 0)){ 106 // 输入的是小数点,并且之前没有小数点,则将小数点附在结果文本框的后面 107 tf.setText( tf.getText() + "."); 108 } else if(!num.equals( ".")){ 109 // 如果输入的不是小数点,则将数字附在结果文本框的后面 110 tf.setText( tf.getText() + num); 111 } 112 113 firstNum = false; 114 } 115 116 /** 117 * 处理C键被按下的事件 118 */ 119 private void handleC(){ 120 // 初始化计算器的各种值 121 tf.setText( "0"); 122 firstNum = true; 123 operator = "="; 124 } 125 126 /** 127 * 处理Backspace键被按下的事件 128 */ 129 private void handleBackspace() { 130 String text = tf.getText(); 131 int i = text.length(); 132 if (i > 0) { 133 // 退格,将文本最后一个字符去掉 134 text = text.substring(0, i - 1); 135 if (text.length() == 0) { 136 // 如果文本没有了内容,则初始化计算器的各种值 137 tf.setText( "0"); 138 firstNum = true; 139 operator = "="; 140 } else { 141 // 显示新的文本 142 tf.setText(text); 143 } 144 } 145 } 146 147 /** 148 * 处理运算符键被按下的事件 149 */ 150 private void handleOperator(String oper){ 151 if ( operator.equals( "/")) { 152 // 除法运算 153 // 如果当前结果文本框中的值等于0 154 if (getNumberFromText() == 0.0) { 155 // 操作不合法 156 operateValidFlag = false; 157 tf.setText( "除数不能为零" ); 158 } else { 159 resultNum /= getNumberFromText(); 160 } 161 } else if ( operator.equals( "+")) { 162 // 加法运算 163 resultNum += getNumberFromText(); 164 } else if ( operator.equals( "-")) { 165 // 减法运算 166 resultNum -= getNumberFromText(); 167 } else if ( operator.equals( "*")) { 168 // 乘法运算 169 resultNum *= getNumberFromText(); 170 } else if ( operator.equals( "=")) { 171 // 赋值运算 172 resultNum = getNumberFromText(); 173 } else if ( operator.equals( "+/-")) { 174 // 正数负数运算 175 resultNum = resultNum * (-1); 176 } else if ( operator.equals( "%")) { 177 // 百分号运算,除以100 178 resultNum = resultNum / 100; 179 } 180 if ( operateValidFlag) { 181 // 双精度浮点数的运算 182 long t1; 183 double t2; 184 t1 = ( long) resultNum; 185 t2 = resultNum - t1; 186 if (t2 == 0) { 187 tf.setText(String. valueOf(t1)); 188 } else { 189 tf.setText(String. valueOf(resultNum)); 190 } 191 } 192 // 运算符等于用户按的按钮 193 operator = oper; 194 firstNum = true; 195 operateValidFlag = true; 196 } 197 198 /** 199 * 从文本框中获取数字 200 */ 201 private double getNumberFromText() { 202 double result = 0; 203 try { //异常捕获 204 result = Double.valueOf(tf.getText()).doubleValue(); 205 } catch (NumberFormatException e) { 206 } 207 return result; 208 } 209 210 //鼠标进入按钮时变为黄色 211 @Override 212 public void mouseEntered(MouseEvent e) { 213 Button b = (Button)e.getSource(); 214 b.setBackground(Color. yellow); 215 } 216 //鼠标离开按钮时恢复颜色 217 @Override 218 public void mouseExited(MouseEvent e) { 219 Button b = (Button)e.getSource(); 220 b.setBackground(Color. CYAN); 221 } 222 //鼠标在按钮上按下时变为红色 223 @Override 224 public void mousePressed(MouseEvent e) { 225 Button b = (Button)e.getSource(); 226 b.setBackground(Color. red); 227 } 228 //鼠标在按钮上释放时恢复颜色 229 @Override 230 public void mouseReleased(MouseEvent e) { 231 Button b = (Button)e.getSource(); 232 b.setBackground(Color. CYAN); 233 234 235 } 236 237 @Override 238 public void mouseClicked(MouseEvent arg0) { 239 // TODO Auto-generated method stub 240 241 } 242 243 244 245 246 /** 247 * 测试类 248 * 249 */ 250 public static void main(String[] args) { 251 Calculator c = new Calculator(); 252 c.additionLayout(); 253 } 254 255 }
原文:http://www.cnblogs.com/junzhao/p/4852455.html