package cn.wlz.com; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.math.BigDecimal; import java.util.Vector; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.UIManager; public class Calculator { //超作数1,为了程序的安全,初值一定设置,这里我们设置为0. String str1="0"; //操作数2 String str2="0"; //运算符 String signal="+"; //运算结果 String result=""; //以下k1至k2为状态开关 //开关1用于选择输入方向,将要写入str1或str2 int k1=1; //开关2用于记录符号键的次数,如果k2>1说明进行的是多符号运算 int k2=1; //开关3用于标识str1是否可以被清0,等于1时可以,不等于1时不能被清0 int k3=1; //开关4用于标识str2是否可以被清0 int k4=1; //开关5用于控制小数点可否被录用,等于1时可以,不为1时,输入的小数点被丢掉 int k5=1; //store的作用类似于寄存器,用于记录是否连续按下符号键 JButton store; Vector vt=new Vector(20,10); //声明各个UI组件对象并初始化 JFrame frame =new JFrame("计算器"); JTextField result_TextField=new JTextField(result,30); JButton clear_Button=new JButton("Clear"); JButton button0=new JButton("0"); JButton button1=new JButton("1"); JButton button2=new JButton("2"); JButton button3=new JButton("3"); JButton button4=new JButton("4"); JButton button5=new JButton("5"); JButton button6=new JButton("6"); JButton button7=new JButton("7"); JButton button8=new JButton("8"); JButton button9=new JButton("9"); JButton button_dian=new JButton("9"); JButton button_jia=new JButton("+"); JButton button_jian=new JButton("-"); JButton button_cheng=new JButton("*"); JButton button_chu=new JButton("/"); JButton button_dy=new JButton("="); //计算机的构造器 public Calculator(){ //为按钮设置等效键,既可以通过对应的键盘按键来代替点击它 button0.setMnemonic(KeyEvent.VK_0); button1.setMnemonic(KeyEvent.VK_1); button2.setMnemonic(KeyEvent.VK_2); button3.setMnemonic(KeyEvent.VK_3); button4.setMnemonic(KeyEvent.VK_4); button5.setMnemonic(KeyEvent.VK_5); button6.setMnemonic(KeyEvent.VK_6); button7.setMnemonic(KeyEvent.VK_7); button8.setMnemonic(KeyEvent.VK_8); button9.setMnemonic(KeyEvent.VK_9); //设置文本框为右对齐,使输入和结果都靠右显示 result_TextField.setHorizontalAlignment(JTextField.RIGHT); //将UI组件添加进容器内 JPanel pan=new JPanel(); pan.setLayout(new GridLayout(4,4,5,5)); pan.add(button0); pan.add(button1); pan.add(button2); pan.add(button3); pan.add(button4); pan.add(button5); pan.add(button6); pan.add(button7); pan.add(button8); pan.add(button9); pan.add(button_cheng); pan.add(button_chu); pan.add(button_dian); pan.add(button_dy); pan.add(button_jia); pan.add(button_jian); pan.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); JPanel pan2=new JPanel(); pan2.setLayout(new BorderLayout()); pan2.add(result_TextField,BorderLayout.WEST); pan2.add(clear_Button, BorderLayout.EAST); //设置主窗口出现在屏幕上的位置 frame.setSize(300, 200); //设置窗体不能调大小 frame.setResizable(false); frame.getContentPane().setLayout(new BorderLayout()); frame.getContentPane().add(pan2, BorderLayout.NORTH); frame.getContentPane().add(pan, BorderLayout.CENTER); frame.pack(); frame.setVisible(true); //事件处理程序 //数字键 class Listener implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub String ss=((JButton)e.getSource()).getText(); store=(JButton)e.getSource(); vt.add(store); if(k1==1){ if(k3==1){ str1=""; //还原开关k5状态 k5=1; } str1=str1+ss; k3=k3+1; //显示结果 result_TextField.setText(str1); }else if(k1==2){ if(k4==1){ str2=""; //还原开关k5状态 k5=1; } str2=str2+ss; k4=k4+1; result_TextField.setText(str2); } } } //输入的运算符号的处理 class Listener_signal implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub String ss2=((JButton)e.getSource()).getText(); store=(JButton)e.getSource(); vt.add(store); if(k2==1){ //开关k1为1时向1写入输入值,时向数2写入输入值。 k1=2; k5=1; signal=ss2; k2=k2+1;//按符号键的次数 }else{ int a=vt.size(); JButton c=(JButton)vt.get(a-2); if(!(c.getText().equals("+"))&&!(c.getText().equals("-"))&&!(c.getText().equals("*")) &&!(c.getText().equals("/"))){ cal(); str1=result; //开关k1为1时,向数1写值,为2时向数2写 k1=2; k5=1; k4=1; signal=ss2; } k2=k2+1; } } } //清除键的逻辑(Clear class Listener_clear implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub store=(JButton)e.getSource(); vt.add(store); k5=1; k2=1; k1=1; k3=1; k4=1; str1="0"; str2="0"; signal=""; result=""; result_TextField.setText(result); vt.clear(); } } //等于键的逻辑 class Listener_dy implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub store=(JButton)e.getSource(); vt.add(store); cal(); //还原各个开关的状态 k1=1; k2=1; k3=1; k4=1; str1=result; } } //小数点的处理 class Listener_xiaos implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub store=(JButton)e.getSource(); vt.add(store); if(k5==1){ String ss2=((JButton)e.getSource()).getText(); if(k1==1){ if(k3==1){ str1=""; //还原开关k5状态 k5=1; } str1=str1+ss2; k3=k3+1; //显示结果 result_TextField.setText(str1); }else if(k1==2){ if(k4==1){ str2=""; //还原开关k5的状态 k5=1; } str2=str2+ss2; k4=k4+1; result_TextField.setText(str2); } } k5=k5+1; } } //注册各个监听器,及绑定事件响应逻辑到各个UI组件上 Listener_dy jt_dy=new Listener_dy(); //监听数字键 Listener jt=new Listener(); //监听符号键 Listener_signal jt_signal=new Listener_signal(); //监听清除键 Listener_clear jt_c=new Listener_clear(); //监听小数点键 Listener_xiaos jt_xs=new Listener_xiaos(); button7.addActionListener(jt); button1.addActionListener(jt); button2.addActionListener(jt); button3.addActionListener(jt); button4.addActionListener(jt); button5.addActionListener(jt); button6.addActionListener(jt); button8.addActionListener(jt); button9.addActionListener(jt); button0.addActionListener(jt); button_chu.addActionListener(jt_signal); button_cheng.addActionListener(jt_signal); button_jian.addActionListener(jt_signal); button_dian.addActionListener(jt_xs); button_dy.addActionListener(jt_dy); button_jia.addActionListener(jt_signal); clear_Button.addActionListener(jt_c); //窗体关闭事件的响应程序 frame.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); } //计算逻辑 public void cal() { //操作数1 double a2; //操作数2 double b2; //运算符 String c=signal; //运算结果 double result2=0; if(c.equals("")){ result_TextField.setText("Please inputoperator"); }else{ //手动处理小数点的问题 if(str1.equals(".")) str1="0.0"; if(str2.equals(".")) str2="0.0"; a2=Double.valueOf(str1).doubleValue(); b2=Double.valueOf(str2).doubleValue(); if(c.equals("+")){ result2=a2+b2; } if(c.equals("-")){ result2=a2-b2; } if(c.equals("*")){ BigDecimal m1=new BigDecimal(Double.toString(a2)); BigDecimal m2=new BigDecimal(Double.toString(b2)); result2=m1.multiply(m2).doubleValue(); } if(c.equals("/")){ if(b2==0){ result2=0; }else{ result2=a2/b2; } } result=((new Double(result2)).toString()); result_TextField.setText(result); } } public static void main(String[] args){ //设置程序显示的界面风格,可以去除 try{ UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); }catch(Exception e){ e.printStackTrace(); } Calculator cal=new Calculator(); } }