Calculator
Posted If I talk to god
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Calculator相关的知识,希望对你有一定的参考价值。
1 package com.shiyanlou.calculator; 2 3 import java.awt.*; 4 import java.awt.event.*; 5 import javax.swing.*; 6 import java.util.Vector; 7 import java.math.BigDecimal; 8 9 public class Calculator { 10 11 // 操作数1,为了程序的安全,初值一定设置,这里我们设置为0。 12 String str1 = "0"; 13 14 // 操作数2 15 String str2 = "0"; 16 17 // 运算符 18 String signal = "+"; 19 20 // 运算结果 21 String result = ""; 22 23 // 以下k1至k2为状态开关 24 25 // 开关1用于选择输入方向,将要写入str1或str2 26 int k1 = 1; 27 // 开关2用于记录符号键的次数,如果 k2>1 说明进行的是 2+3-9+8 这样的多符号运算 28 int k2 = 1; 29 // 开关3用于标识 str1 是否可以被清0 ,等于1时可以,不等于1时不能被清0 30 int k3 = 1; 31 // 开关4用于标识 str2 是否可以被清0 32 int k4 = 1; 33 // 开关5用于控制小数点可否被录入,等于1时可以,不为1时,输入的小数点被丢掉 34 int k5 = 1; 35 // store的作用类似于寄存器,用于记录是否连续按下符号键 36 JButton store; 37 38 @SuppressWarnings("rawtypes") 39 Vector vt = new Vector(20, 10); 40 41 // 声明各个UI组件对象并初始化 42 JFrame frame = new JFrame("Calculator"); 43 JTextField result_TextField = new JTextField(result, 20); 44 JButton clear_Button = new JButton("Clear"); 45 JButton button0 = new JButton("0"); 46 JButton button1 = new JButton("1"); 47 JButton button2 = new JButton("2"); 48 JButton button3 = new JButton("3"); 49 JButton button4 = new JButton("4"); 50 JButton button5 = new JButton("5"); 51 JButton button6 = new JButton("6"); 52 JButton button7 = new JButton("7"); 53 JButton button8 = new JButton("8"); 54 JButton button9 = new JButton("9"); 55 JButton button_Dian = new JButton("."); 56 JButton button_jia = new JButton("+"); 57 JButton button_jian = new JButton("-"); 58 JButton button_cheng = new JButton("*"); 59 JButton button_chu = new JButton("/"); 60 JButton button_dy = new JButton("="); 61 62 // 计算机类的构造器 63 public Calculator() { 64 65 // 为按钮设置等效键,即可以通过对应的键盘按键来代替点击它 66 button0.setMnemonic(KeyEvent.VK_0); 67 // 其它等效键省略,你可以自行补充完整 68 69 // 设置文本框为右对齐,使输入和结果都靠右显示 70 result_TextField.setHorizontalAlignment(JTextField.RIGHT); 71 72 // 将UI组件添加进容器内 73 JPanel pan = new JPanel(); 74 pan.setLayout(new GridLayout(4, 4, 5, 5)); 75 pan.add(button7); 76 pan.add(button8); 77 pan.add(button9); 78 pan.add(button_chu); 79 pan.add(button4); 80 pan.add(button5); 81 pan.add(button6); 82 pan.add(button_cheng); 83 pan.add(button1); 84 pan.add(button2); 85 pan.add(button3); 86 pan.add(button_jian); 87 pan.add(button0); 88 pan.add(button_Dian); 89 pan.add(button_dy); 90 pan.add(button_jia); 91 pan.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 92 93 JPanel pan2 = new JPanel(); 94 pan2.setLayout(new BorderLayout()); 95 pan2.add(result_TextField, BorderLayout.WEST); 96 pan2.add(clear_Button, BorderLayout.EAST); 97 98 // 设置主窗口出现在屏幕上的位置 99 frame.setLocation(300, 200); 100 // 设置窗体不能调大小 101 frame.setResizable(false); 102 frame.getContentPane().setLayout(new BorderLayout()); 103 frame.getContentPane().add(pan2, BorderLayout.NORTH); 104 frame.getContentPane().add(pan, BorderLayout.CENTER); 105 106 frame.pack(); 107 frame.setVisible(true); 108 109 // 事件处理程序 110 111 // 数字键 112 class Listener implements ActionListener { 113 @SuppressWarnings("unchecked") 114 public void actionPerformed(ActionEvent e) { 115 String ss = ((JButton) e.getSource()).getText(); 116 store = (JButton) e.getSource(); 117 vt.add(store); 118 if (k1 == 1) { 119 if (k3 == 1) { 120 str1 = ""; 121 122 // 还原开关k5状态 123 k5 = 1; 124 } 125 str1 = str1 + ss; 126 127 k3 = k3 + 1; 128 129 // 显示结果 130 result_TextField.setText(str1); 131 132 } else if (k1 == 2) { 133 if (k4 == 1) { 134 str2 = ""; 135 136 // 还原开关k5状态 137 k5 = 1; 138 } 139 str2 = str2 + ss; 140 k4 = k4 + 1; 141 result_TextField.setText(str2); 142 } 143 144 } 145 } 146 147 // 输入的运算符号的处理 148 class Listener_signal implements ActionListener { 149 @SuppressWarnings("unchecked") 150 public void actionPerformed(ActionEvent e) { 151 String ss2 = ((JButton) e.getSource()).getText(); 152 store = (JButton) e.getSource(); 153 vt.add(store); 154 155 if (k2 == 1) { 156 // 开关 k1 为 1 时向数 1 写输入值,为2时向数2写输入值。 157 k1 = 2; 158 k5 = 1; 159 signal = ss2; 160 k2 = k2 + 1;// 按符号键的次数 161 } else { 162 int a = vt.size(); 163 JButton c = (JButton) vt.get(a - 2); 164 165 if (!(c.getText().equals("+")) 166 && !(c.getText().equals("-")) 167 && !(c.getText().equals("*")) 168 && !(c.getText().equals("/"))) 169 170 { 171 cal(); 172 str1 = result; 173 // 开关 k1 为 1 时,向数 1 写值,为2时向数2写 174 k1 = 2; 175 k5 = 1; 176 k4 = 1; 177 signal = ss2; 178 } 179 k2 = k2 + 1; 180 181 } 182 183 } 184 } 185 186 // 清除键的逻辑(Clear) 187 class Listener_clear implements ActionListener { 188 @SuppressWarnings("unchecked") 189 public void actionPerformed(ActionEvent e) { 190 store = (JButton) e.getSource(); 191 vt.add(store); 192 k5 = 1; 193 k2 = 1; 194 k1 = 1; 195 k3 = 1; 196 k4 = 1; 197 str1 = "0"; 198 str2 = "0"; 199 signal = ""; 200 result = ""; 201 result_TextField.setText(result); 202 vt.clear(); 203 } 204 } 205 206 // 等于键的逻辑 207 class Listener_dy implements ActionListener { 208 @SuppressWarnings("unchecked") 209 public void actionPerformed(ActionEvent e) { 210 211 store = (JButton) e.getSource(); 212 vt.add(store); 213 cal(); 214 215 // 还原各个开关的状态 216 k1 = 1; 217 k2 = 1; 218 k3 = 1; 219 k4 = 1; 220 221 str1 = result; 222 } 223 } 224 225 // 小数点的处理 226 class Listener_xiaos implements ActionListener { 227 @SuppressWarnings("unchecked") 228 public void actionPerformed(ActionEvent e) { 229 store = (JButton) e.getSource(); 230 vt.add(store); 231 if (k5 == 1) { 232 String ss2 = ((JButton) e.getSource()).getText(); 233 if (k1 == 1) { 234 if (k3 == 1) { 235 str1 = ""; 236 // 还原开关k5状态 237 k5 = 1; 238 } 239 str1 = str1 + ss2; 240 241 k3 = k3 + 1; 242 243 // 显示结果 244 result_TextField.setText(str1); 245 246 } else if (k1 == 2) { 247 if (k4 == 1) { 248 str2 = ""; 249 // 还原开关k5的状态 250 k5 = 1; 251 } 252 str2 = str2 + ss2; 253 254 k4 = k4 + 1; 255 256 result_TextField.setText(str2); 257 } 258 } 259 260 k5 = k5 + 1; 261 } 262 } 263 264 // 注册各个监听器,即绑定事件响应逻辑到各个UI组件上 265 Listener_dy jt_dy = new Listener_dy(); 266 267 // 监听数字键 268 Listener jt = new Listener(); 269 // 监听符号键 270 Listener_signal jt_signal = new Listener_signal(); 271 // 监听清除键 272 Listener_clear jt_c = new Listener_clear(); 273 // 监听小数点键 274 Listener_xiaos jt_xs = new Listener_xiaos(); 275 276 button7.addActionListener(jt); 277 button8.addActionListener(jt); 278 button9.addActionListener(jt); 279 button_chu.addActionListener(jt_signal); 280 button4.addActionListener(jt); 281 button5.addActionListener(jt); 282 button6.addActionListener(jt); 283 button_cheng.addActionListener(jt_signal); 284 button1.addActionListener(jt); 285 button2.addActionListener(jt); 286 button3.addActionListener(jt); 287 button_jian.addActionListener(jt_signal); 288 button0.addActionListener(jt); 289 button_Dian.addActionListener(jt_xs); 290 button_dy.addActionListener(jt_dy); 291 button_jia.addActionListener(jt_signal); 292 clear_Button.addActionListener(jt_c); 293 294 // 窗体关闭事件的响应程序 295 frame.addWindowListener(new WindowAdapter() { 296 public void windowClosing(WindowEvent e) { 297 System.exit(0); 298 } 299 }); 300 301 } 302 303 // 计算逻辑 304 public void cal() { 305 // 操作数1 306 double a2; 307 // 操作数2 308 double b2; 309 // 运算符 310 String c = signal; 311 // 运算结果 312 double result2 = 0; 313 314 if (c.equals("")) { 315 result_TextField.setText("Please input operator"); 316 317 } else { 318 // 手动处理小数点的问题 319 if (str1.equals(".")) 320 str1 = "0.0"; 321 if (str2.equals(".")) 322 str2 = "0.0"; 323 a2 = Double.valueOf(str1).doubleValue(); 324 b2 = Double.valueOf(str2).doubleValue(); 325 326 if (c.equals("+")) { 327 result2 = a2 + b2; 328 } 329 if (c.equals("-")) { 330 result2 = a2 - b2; 331 } 332 if (c.equals("*")) { 333 BigDecimal m1 = new BigDecimal(Double.toString(a2)); 334 BigDecimal m2 = new BigDecimal(Double.toString(b2)); 335 result2 = m1.multiply(m2).doubleValue(); 336 } 337 if (c.equals("/")) { 338 if (b2 == 0) { 339 result2 = 0; 340 } else { 341 result2 = a2 / b2; 342 } 343 344 } 345 346 result = ((new Double(result2)).toString()); 347 348 result_TextField.setText(result); 349 } 350 } 351 352 @SuppressWarnings("unused") 353 public static void main(String[] args) { 354 // 设置程序显示的界面风格,可以去除 355 try { 356 UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); 357 } catch (Exception e) { 358 e.printStackTrace(); 359 } 360 Calculator cal = new Calculator(); 361 } 362 363 }
以上是关于Calculator的主要内容,如果未能解决你的问题,请参考以下文章
uva 11549 Calculator Conundrum
FZU-Problem 2294 Uint47 calculator
Arcgis中用raster calculator怎样 计算山的顶点,应怎样编写
线程“主”java.lang.ArrayIndexOutOfBoundsException 中的异常:Calculator.main 中的 0(Calculator.java:25)[重复]