import java.awt.*; import java.awt.event.*; import java.text.DecimalFormat; import javax.swing.*; public class Calculator implements ActionListener { JFrame frame; JPanel panel, panel1, panel2, panel3; JMenuBar mainMenu; JMenu mcalculator, mhelp; JMenuItem miquit, miabout; JTextField textAnswer; JButton btnBksp, btnCE, btnClr, btnAddSub, btnAdd, btnSub, btnMul, btnDiv, btnEqu, btnDot; JButton button[]; //key 当前运算 //prekey 前一次运算 short key = -1; short prekey = -1; double answer,vard; boolean clickable = true; DecimalFormat df; public Calculator() { df = new DecimalFormat("0.##########"); //*******************布局*************************** // name frame = new JFrame("Calculor"); // panel panel = new JPanel(); frame.getContentPane().add(panel); panel.setLayout(new BorderLayout(10, 10)); // mainMenu mainMenu = new JMenuBar(); mcalculator = new JMenu("calculator"); mhelp = new JMenu("help"); mainMenu.add(mcalculator); mainMenu.add(mhelp); miquit = new JMenuItem("quit"); miabout = new JMenuItem("about"); mcalculator.add(miquit); mhelp.add(miabout); frame.setJMenuBar(mainMenu); // panel.add(mainMenu, BorderLayout.NORTH); // textField textAnswer = new JTextField(15); panel.add(textAnswer, BorderLayout.NORTH); // panel1 btnBksp = new JButton("Bksp"); btnCE = new JButton("CE"); btnClr = new JButton("Clr"); btnAddSub = new JButton("+/-"); btnAdd = new JButton("+"); btnSub = new JButton("-"); btnMul = new JButton("*"); btnDiv = new JButton("/"); btnEqu = new JButton("="); btnDot = new JButton("."); button = new JButton[10]; for (int i = 0; i <= 9; ++i) { button[i] = new JButton("" + i); } panel1 = new JPanel(); panel1.setLayout(new GridLayout(5, 4, 10, 10)); panel1.add(btnBksp); panel1.add(btnCE); panel1.add(btnClr); panel1.add(btnAddSub); for (int i = 7; i <= 9; ++i) { panel1.add(button[i]); } panel1.add(btnDiv); for (int i = 4; i <= 6; ++i) { panel1.add(button[i]); } panel1.add(btnMul); for (int i = 1; i <= 3; ++i) { panel1.add(button[i]); } panel1.add(btnSub); panel1.add(button[0]); panel1.add(btnDot); panel1.add(btnEqu); panel1.add(btnAdd); panel.add(panel1, BorderLayout.SOUTH); // JPanel tmp1 = new JPanel(); // JPanel tmp2 = new JPanel(); // panel.add(tmp1,BorderLayout.EAST); // panel.add(tmp2,BorderLayout.WEST); // show in the center // ***********************监听********************** btnBksp.addActionListener(this); btnCE.addActionListener(this); btnClr.addActionListener(this); btnAddSub.addActionListener(this); btnDot.addActionListener(this); btnAdd.addActionListener(this); btnSub.addActionListener(this); btnMul.addActionListener(this); btnDiv.addActionListener(this); btnEqu.addActionListener(this); for(int i=0; i<=9; ++i) { button[i].addActionListener(this); } //********************显示**************************************** Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize(); frame.setLocation((scrSize.width - frame.getSize().width) / 2, (scrSize.height - frame.getSize().height) / 2); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setResizable(false); frame.setVisible(true); } //*************************事件处理************************************ @Override public void actionPerformed(ActionEvent ae) { Object tmp = ae.getSource(); try { for(int i=0; i<=9; ++i) { if(tmp == button[i] && true == clickable) { textAnswer.setText(textAnswer.getText() + Integer.toString(i)); } } //小数点按钮,如果还没有小数点就加点 if(tmp == btnDot && true == clickable) { boolean isDot = false; if(0 == textAnswer.getText().length()) isDot = true; for(int i=0; i<textAnswer.getText().length(); ++i) { if('.' == textAnswer.getText().charAt(i)) { isDot = true; break; } } if(false == isDot && true == clickable) { textAnswer.setText(textAnswer.getText() + "."); } } if((tmp == btnAdd || tmp == btnSub || tmp == btnMul || tmp == btnDiv) && true == clickable) { //根据前一种运算确定 answer值 if(tmp == btnAdd) { switch (prekey){ case 0: answer += Double.parseDouble(textAnswer.getText()); break; case 1: answer -= Double.parseDouble(textAnswer.getText()); break; case 2: answer *= Double.parseDouble(textAnswer.getText()); break; case 3: if(0 ==Double.parseDouble(textAnswer.getText())) { textAnswer.setText("Error:Div by zero!"); clickable = false; } else answer /= Double.parseDouble(textAnswer.getText()); break; default: answer = Double.parseDouble(textAnswer.getText()); } textAnswer.setText(""); prekey = key = 0; } if(tmp == btnSub) { switch (prekey){ case 0: answer += Double.parseDouble(textAnswer.getText()); break; case 1: answer -= Double.parseDouble(textAnswer.getText()); break; case 2: answer *= Double.parseDouble(textAnswer.getText()); break; case 3: if(0 ==Double.parseDouble(textAnswer.getText())) { textAnswer.setText("Error:Div by zero!"); clickable = false; } else answer /= Double.parseDouble(textAnswer.getText()); break; default: answer = Double.parseDouble(textAnswer.getText()); } textAnswer.setText(""); prekey = key = 1; } if(tmp == btnMul) { switch (prekey){ case 0: answer += Double.parseDouble(textAnswer.getText()); break; case 1: answer -= Double.parseDouble(textAnswer.getText()); break; case 2: answer *= Double.parseDouble(textAnswer.getText()); break; case 3: if(0 ==Double.parseDouble(textAnswer.getText())) { textAnswer.setText("Error:Div by zero!"); clickable = false; } else answer /= Double.parseDouble(textAnswer.getText()); break; default: answer = Double.parseDouble(textAnswer.getText()); } textAnswer.setText(""); prekey = key = 2; } if(tmp == btnDiv) { switch (prekey){ case 0: answer += Double.parseDouble(textAnswer.getText()); break; case 1: answer -= Double.parseDouble(textAnswer.getText()); break; case 2: answer *= Double.parseDouble(textAnswer.getText()); break; case 3: if(0 ==Double.parseDouble(textAnswer.getText())) { textAnswer.setText("Error:Div by zero!"); clickable = false; } else answer /= Double.parseDouble(textAnswer.getText()); break; default: answer = Double.parseDouble(textAnswer.getText()); } textAnswer.setText(""); prekey = key = 3; } } if(tmp == btnEqu && true == clickable) { //连续按等号,则作连续运算 if(5 == prekey) { if(0== key) { answer += vard; textAnswer.setText(df.format(answer)); } if(1== key) { answer -= vard; textAnswer.setText(df.format(answer)); } if(2== key) { answer *= vard; textAnswer.setText(df.format(answer)); } if(3== key) { if(0 ==Double.parseDouble(textAnswer.getText())) { textAnswer.setText("Error:Div by zero!"); clickable = false; } else answer /= vard; textAnswer.setText(df.format(answer)); } } else { vard = Double.parseDouble(textAnswer.getText()); switch (prekey){ case 0: answer += Double.parseDouble(textAnswer.getText()); break; case 1: answer -= Double.parseDouble(textAnswer.getText()); break; case 2: answer *= Double.parseDouble(textAnswer.getText()); break; case 3: if(0 ==Double.parseDouble(textAnswer.getText())) { textAnswer.setText("Error:Div by zero!"); clickable = false; } else answer /= Double.parseDouble(textAnswer.getText()); break; default: answer = Double.parseDouble(textAnswer.getText()); } //把答案贴出来 textAnswer.setText(df.format(answer)); } prekey = 5; } if (tmp == btnBksp && true == clickable) { String s = textAnswer.getText(); textAnswer.setText(""); for (int i = 0; i < s.length() - 1; ++i) { char a = s.charAt(i); textAnswer.setText(textAnswer.getText() + a); } } //当前窗口清0 if (tmp == btnCE) { textAnswer.setText(""); clickable = true; } //Clr键要把所有都清0 if (tmp == btnClr) { answer = 0; vard = 0; textAnswer.setText(""); clickable = true; } if (tmp == btnAddSub && true == clickable) { boolean isNumber = true; String s = textAnswer.getText(); for (int i = 0; i < s.length(); ++i) { if (!(s.charAt(i) >= '0' && s.charAt(i) <= '9' || '.' == s.charAt(i) || '-' == s.charAt(i))) { isNumber = false; break; } } if (true == isNumber) { if ('-' == s.charAt(0)) { textAnswer.setText(""); for (int i = 1; i < s.length(); ++i) { char a = s.charAt(i); textAnswer.setText(textAnswer.getText() + a); } } else { textAnswer.setText('-' + s); } } } } catch (Exception e) { textAnswer.setText("Error!"); clickable = false; } } public static void main(String[] args) { new Calculator(); } }