1 package Calculator_JCoder; 2 3 import java.awt.*; 4 import java.awt.event.ActionEvent; 5 import java.awt.event.ActionListener; 6 import java.awt.event.KeyEvent; 7 import java.awt.event.KeyListener; 8 import java.text.DecimalFormat; 9 import javax.swing.*; 10 import java.util.*; 11 import java.math.*; 12 13 public class Calculator extends JFrame implements ActionListener { 14 static Font F = new Font("宋体",Font.BOLD,25); 15 static Font _F = new Font("宋体",Font.BOLD,40); 16 static DecimalFormat DF = new DecimalFormat("0.000"); 17 static String IN = ""; 18 static JTextField Text_Res = new JTextField("0"); 19 static JTextField Text_Now = new JTextField(""); 20 static JButton Keys[] = new JButton[21]; 21 static String KeysName[] = { 22 "7", "8", "9", "4", "5", "6", "1", "2", 23 "3", "0", ".", "+", "-", "*", "/", "=", 24 "CE", "(", ")", "^", "C" 25 }; 26 27 static int CMP(char a){ 28 if(a == '#'){return 0;} 29 if(a == '('){return 1;} 30 if(a == '+' || a == '-'){return 3;} 31 if(a == '*' || a == '/'){return 4;} 32 if(a == '^'){return 5;} 33 if(a == ')'){return 6;} 34 return -1; 35 } 36 37 static String Change(String in){ 38 in += "#"; 39 int L = in.length(); 40 String t = ""; 41 String NPR = ""; 42 Stack<Character> S = new Stack(); 43 for(int i = 0;i < L;i ++){ 44 if(in.charAt(i) >= '0' && in.charAt(i) <= '9'){t += in.charAt(i);} 45 else if(in.charAt(i) == '.'){t += in.charAt(i);} 46 else if(in.charAt(i) == '#'){ 47 if(t.length() != 0){NPR += t + " ";} 48 t = ""; 49 } 50 else if(in.charAt(i) == '+' || in.charAt(i) == '-' || in.charAt(i) == '*' || in.charAt(i) == '/' || in.charAt(i) == '^'){ 51 if(t.length() != 0){NPR += t + " ";} 52 t = ""; 53 if(S.size() == 0){ 54 S.push(in.charAt(i)); 55 } 56 else if(CMP(S.peek()) < CMP(in.charAt(i))){ 57 S.push(in.charAt(i)); 58 } 59 else if(CMP(S.peek()) >= CMP(in.charAt(i))){ 60 while(S.size() > 0 && CMP(S.peek()) >= CMP(in.charAt(i))) { 61 NPR += S.peek() + " "; 62 S.pop(); 63 } 64 S.push(in.charAt(i)); 65 } 66 } 67 else if(in.charAt(i) == '('){ 68 if(t.length() != 0){NPR += t + " ";} 69 t = ""; 70 S.push(in.charAt(i)); 71 } 72 else if(in.charAt(i) == ')'){ 73 if(t.length() != 0){NPR += t + " ";} 74 t = ""; 75 while(S.peek() != '('){ 76 NPR += S.peek() + " "; 77 S.pop(); 78 } 79 S.pop(); 80 } 81 } 82 while(S.size() != 0){ 83 NPR += S.peek() + " "; 84 S.pop(); 85 } 86 //System.out.println(NPR); 87 return NPR; 88 } 89 90 static double Solve(double a,double b,char c){ 91 double out = 0.0; 92 if(c == '+'){ 93 out = a + b; 94 } 95 else if(c == '-'){ 96 out = a - b; 97 } 98 else if(c == '*'){ 99 out = a * b; 100 } 101 else if(c == '/'){ 102 out = a / b; 103 } 104 else if(c == '^'){ 105 out = Math.pow(a,b); 106 } 107 return out; 108 } 109 110 static double Cal(String now){ 111 String Sp[] = now.split("\ "); 112 Stack<Double> S = new Stack(); 113 for(int i = 0;i < Sp.length;i ++){ 114 if(Sp[i].length() == 0){continue;} 115 if(Sp[i].charAt(0) <= '9' && Sp[i].charAt(0) >= '0'){ 116 S.push(Double.valueOf(Sp[i])); 117 } 118 else{ 119 double b = S.peek();S.pop(); 120 double a = S.peek();S.pop(); 121 double c = Solve(a,b,Sp[i].charAt(0)); 122 S.push(c); 123 } 124 } 125 double ans = S.peek(); 126 return ans; 127 } 128 129 static String SetS(int x){ 130 if(x == 1){return "+";} 131 if(x == 2){return "-";} 132 if(x == 3){return "*";} 133 if(x == 4){return "/";} 134 return "0"; 135 } 136 137 138 public void init() { 139 JPanel KeysP = new JPanel(); 140 KeysP.setLayout(null); 141 KeysP.setSize(500,500); 142 for(int i = 0;i <= 20;i ++){ 143 Keys[i] = new JButton(KeysName[i]); 144 KeysP.add(Keys[i]); 145 Keys[i].setFont(F); 146 } 147 Keys[0].setBounds(20,20,60,60); 148 Keys[1].setBounds(85,20,60,60); 149 Keys[2].setBounds(150,20,60,60); 150 Keys[3].setBounds(20,85,60,60); 151 Keys[4].setBounds(85,85,60,60); 152 Keys[5].setBounds(150,85,60,60); 153 Keys[6].setBounds(20,150,60,60); 154 Keys[7].setBounds(85,150,60,60); 155 Keys[8].setBounds(150,150,60,60); 156 Keys[9].setBounds(20,215,125,60); 157 Keys[10].setBounds(150,215,60,60); 158 Keys[11].setBounds(215,20,60,60); 159 Keys[12].setBounds(280,20,60,60); 160 Keys[13].setBounds(215,85,60,60); 161 Keys[14].setBounds(280,85,60,60); 162 Keys[15].setBounds(215,150,125,60); 163 Keys[16].setBounds(215,215,125,60); 164 Keys[17].setBounds(345,20,60,60); 165 Keys[18].setBounds(345,85,60,60); 166 Keys[19].setBounds(345,150,60,60); 167 Keys[20].setBounds(345,215,60,60); 168 169 Text_Res.setHorizontalAlignment(JTextField.RIGHT); 170 Text_Now.setHorizontalAlignment(JTextField.RIGHT); 171 Text_Res.setEditable(false); 172 Text_Now.setEditable(false); 173 Text_Res.setBackground(Color.WHITE); 174 Text_Now.setBackground(Color.WHITE); 175 JPanel TextP = new JPanel(); 176 TextP.setLayout(null); 177 TextP.setSize(500,100); 178 TextP.add(Text_Res); 179 Text_Res.setBounds(20, 60, 385, 60); 180 TextP.add(Text_Now); 181 Text_Now.setBounds(20, 20, 385, 40); 182 Text_Res.setFont(_F); 183 Text_Now.setFont(F); 184 185 JPanel BigP = new JPanel(); 186 BigP.setSize(800,600); 187 BigP.setLayout(null); 188 BigP.add(KeysP); 189 BigP.add(TextP); 190 KeysP.setBounds(0, 120, 600, 600); 191 TextP.setBounds(0, 0, 500, 200); 192 getContentPane().setLayout(null); 193 getContentPane().add(BigP); 194 195 for (int i = 0; i <= 20; i ++) { 196 Keys[i].addActionListener(this); 197 } 198 199 } 200 201 public void actionPerformed(ActionEvent e) { 202 String Get = e.getActionCommand(); 203 if("0123456789.+-*/^()".indexOf(Get) >= 0){ 204 IN = IN + Get; 205 Text_Now.setText(IN); 206 } 207 else if("=".indexOf(Get) >= 0){ 208 double show = Cal(Change(IN)); 209 //System.out.println(show); 210 //System.out.println(show); 211 String t1 = String.valueOf(show); 212 String t2 = String.valueOf(DF.format(show)); 213 Text_Res.setText(t1); 214 IN = t2; 215 } 216 else if("CE".compareTo(Get) == 0){ 217 int L = IN.length(); 218 if(L != 0){IN = IN.substring(0,L - 1);} 219 Text_Now.setText(IN); 220 } 221 else if("C".compareTo(Get) == 0){ 222 IN = ""; 223 Text_Now.setText(IN); 224 Text_Res.setText("0"); 225 } 226 } 227 228 public Calculator(){ 229 super(); 230 init(); 231 this.setTitle("Calculator By-J_Coder"); 232 this.setResizable(false); 233 this.setLocation(100,100); 234 this.setSize(440,450); 235 } 236 237 public static void main(String[] args) { 238 Calculator window = new Calculator(); 239 window.setVisible(true); 240 window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 241 } 242 }