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 }

 

posted @ 2018-05-04 10:21  中创IT空间  阅读(530)  评论(0编辑  收藏  举报