java-Coculator

  1 package Coculator;
  2 
  3 import java.awt.BorderLayout;
  4 import java.awt.GridLayout;
  5 import java.awt.event.ActionEvent;
  6 import java.awt.event.ActionListener;
  7 import java.math.*;
  8 
  9 import javax.swing.JButton;
 10 import javax.swing.JFrame;
 11 import javax.swing.JMenu;
 12 import javax.swing.JMenuBar;
 13 import javax.swing.JMenuItem;
 14 import javax.swing.JOptionPane;
 15 import javax.swing.JPanel;
 16 import javax.swing.JTextField;
 17 
 18 public class MyCoculator extends JFrame implements ActionListener {
 19     
 20 //    生成结果显示区,25个按钮,菜单栏
 21     JTextField result = new JTextField();
 22     JButton[] btns = new JButton[25];
 23     JMenuBar mb = new JMenuBar();
 24     
 25 //    生成两个菜单
 26     JMenu fileMenu = new JMenu("文件");
 27     JMenu helpMenu = new JMenu("帮助");
 28 //    生成菜单项
 29     JMenuItem saveMI = new JMenuItem("保存");
 30     JMenuItem exitMI = new JMenuItem("退出");
 31     JMenuItem helpMI = new JMenuItem("帮助");
 32     JMenuItem aboutMI = new JMenuItem("关于");
 33     
 34 //    设置三个变量分别为结果,前一个操作数,后一个操作数
 35     double cal,before,back;
 36     String foreText = new String("");
 37     String backText = new String("");
 38     boolean flag = false;//判断第一个数输入是否结束
 39     boolean eq = false;//判断等号操作
 40     String op = "";//操作符
 41     
 42     public void init() {
 43 //        向文件菜单中添加保存,退出和一个分割线
 44         fileMenu.add(saveMI);
 45         fileMenu.addSeparator();//分割线
 46         fileMenu.add(exitMI);
 47         
 48 //        向帮助菜单中添加帮助,关于和一个分割线
 49         helpMenu.add(helpMI);
 50         helpMenu.addSeparator();
 51         helpMenu.add(aboutMI);
 52         
 53 //        把这两个菜单添加到菜单栏里
 54         mb.add(fileMenu);
 55         mb.add(helpMenu);
 56         
 57 //        使用边界布局管理器把结果区放在上部
 58         this.add(result, BorderLayout.NORTH);
 59         
 60 //        因为center区只能放一个块,所以把25个按钮放到一个JPanel里,再把JPanel放到center区中
 61         JPanel p = new JPanel();
 62         p.setLayout(new GridLayout(5,5,3,3));//使用网格布局设置5行5列,水平垂直间距都为3
 63         
 64 //        把25个按钮放在25个单元格里
 65         
 66 //        先生成0~9十个数字按钮
 67         for(int i=0;i<10;i++) {
 68             btns[i] = new JButton(String.valueOf(i));
 69             btns[i].addActionListener(this);
 70         }
 71         
 72         btns[10] = new JButton("AC");
 73         btns[11] = new JButton("CE");
 74         btns[12] = new JButton("C");
 75         btns[13] = new JButton("+/-");
 76         btns[14] = new JButton("SQRT");
 77 //        放第一行按钮
 78         p.add(btns[10]);
 79         p.add(btns[11]);
 80         p.add(btns[12]);
 81         p.add(btns[13]);
 82         p.add(btns[14]);
 83         
 84         btns[15] = new JButton("/");
 85         btns[16] = new JButton("%");
 86 //        放第二行按钮
 87         p.add(btns[7]);
 88         p.add(btns[8]);
 89         p.add(btns[9]);
 90         p.add(btns[15]);
 91         p.add(btns[16]);
 92         
 93         btns[17] = new JButton("*");
 94         btns[18] = new JButton("1/x");
 95 //        放第三行按钮
 96         p.add(btns[4]);
 97         p.add(btns[5]);
 98         p.add(btns[6]);
 99         p.add(btns[17]);
100         p.add(btns[18]);
101         
102         btns[19] = new JButton("-");
103         btns[20] = new JButton("=");
104 //        放第四行按钮
105         p.add(btns[1]);
106         p.add(btns[2]);
107         p.add(btns[3]);
108         p.add(btns[19]);
109         p.add(btns[20]);
110         
111         btns[21] = new JButton(".");
112         btns[22] = new JButton("+");
113         btns[23] = new JButton("Backspace");
114         btns[24] = new JButton("Help");
115 //        放第五行按钮
116         p.add(btns[0]);
117         p.add(btns[21]);
118         p.add(btns[22]);
119         p.add(btns[23]);
120         p.add(btns[24]);
121         
122         btns[21].addActionListener(this);// .
123         btns[15].addActionListener(this);// /
124         btns[17].addActionListener(this);// *
125         btns[19].addActionListener(this);// -
126         btns[22].addActionListener(this);// +
127         btns[20].addActionListener(this);// =
128         btns[10].addActionListener(this);// AC
129         btns[18].addActionListener(this);// 1/x
130         btns[16].addActionListener(this);// %
131         btns[13].addActionListener(this);// +/-
132         btns[14].addActionListener(this);// SQRT
133         btns[11].addActionListener(this);// AE
134         btns[12].addActionListener(this);// C
135         btns[23].addActionListener(this);// Backspace
136         
137         this.add(p);//Java默认加到center区
138         this.setJMenuBar(mb);
139         this.setVisible(true);
140         this.setResizable(true);//大小可变
141         this.setBounds(700, 300, 400, 500);//位置(700,300),窗体宽300高400
142         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭退出
143         
144 //        事件监听器
145         aboutMI.addActionListener(this);
146     }
147     
148     public static void main(String[] args) {
149         // TODO Auto-generated method stub
150         MyCoculator c =  new MyCoculator();
151         c.init();
152     }
153 
154     @Override
155     public void actionPerformed(ActionEvent e) {
156         // TODO Auto-generated method stub
157         if(e.getSource()==this.aboutMI) {
158             JOptionPane.showMessageDialog(null,"Made in ZhouXiangQ");
159         }
160         
161 //        第一个操作数
162         for(int i=0;i<=9;i++) {
163             if(e.getSource()==btns[i]&&!flag) {
164                 result.setText("");
165                 foreText += e.getActionCommand();
166                 result.setText(foreText);
167             }
168         }
169 //        如果操作是点继续输入
170         if(!flag && foreText!="") {
171             if(e.getSource()==btns[21]) {
172                 foreText += e.getActionCommand();
173                 result.setText(foreText);
174             }
175         }
176 //        如果操作是/,*,-,+,%等操作,就正式确定第一个数结束
177         if(e.getSource()==btns[15]||
178                 e.getSource()==btns[17]||
179                     e.getSource()==btns[19]||
180                         e.getSource()==btns[22]||
181                             e.getSource()==btns[18]||
182                                 e.getSource()==btns[14]||
183                                     e.getSource()==btns[16]) {
184             flag = true;
185             this.before = Double.parseDouble(foreText);
186             result.setText("");
187             op = e.getActionCommand();
188         }
189 
190 //        第二个数
191         for(int i=0;i<=9;i++) {
192             if(e.getSource()==btns[i]&&flag) {
193                 backText += e.getActionCommand();
194                 result.setText(backText);
195             }
196         }
197         //如果操作是点且backText不空就继续输入
198         if(flag&&backText!="") {
199             if(e.getSource()==btns[21]) {
200                 backText += e.getActionCommand();
201                 result.setText(backText);
202             }
203         }
204 //        如果操作是等号且flag为真,则判断op的具体操作。
205         if(e.getSource()==btns[20]&&flag&&this.before>=0) {
206             eq = true;
207             this.back = Double.parseDouble(backText);
208             if(op.equals("+"))
209                 cal = this.before + this.back;
210             else if(op.equals("-"))
211                 cal = this.before - this.back;
212             else if(op.equals("*"))
213                 cal = this.before * this.back;
214             else if(op.equals("/") && this.back!=0.0)
215                 cal = this.before / this.back;
216             else if(op.equals("%")) {
217                 cal = Math.floorMod((int)this.before, (int)this.back);
218             }
219             else if(op.equals("+/-")) {
220                 cal = cal*(-1);
221             }
222             else 
223                 cal = 0.0;
224             this.result.setText(String.valueOf(cal));
225         }
226 //        求导运算
227         if(e.getSource()==btns[18]) {
228             if(op.equals("1/x")) {
229                 cal = 1/cal;
230                 this.result.setText(String.valueOf(cal));
231             }
232         }
233 //        开方运算
234         if(e.getSource()==btns[14]) {
235             if(op.equals("SQRT")) {
236                 cal = Math.sqrt(cal);
237                 this.result.setText(String.valueOf(cal));
238             }
239         }
240 //        负数操作
241         if(e.getSource()==btns[13] && foreText!="") {
242             if(e.getActionCommand().equals("+/-")) {
243                 String ff = result.getText();
244                 flag = true;
245                 this.before = Double.parseDouble(foreText);
246                 result.setText("-" + ff);
247                 this.before = this.before*(-1);
248             }
249         }
250 //        归零
251         if(e.getSource()==btns[10]||e.getSource()==btns[11]||e.getSource()==btns[12]) {
252             flag = false;
253             eq = false;
254             foreText = "";
255             backText = "";
256             this.result.setText("0");
257         }
258         
259 
260 }
原文地址:https://www.cnblogs.com/JasonKuLaLa/p/10964307.html