java简单计算器

写的一个小计算器,留着以后看吧。
  1 import java.awt.BorderLayout;
  2 import java.awt.Button;
  3 import java.awt.Color;
  4 import java.awt.Dimension;
  5 import java.awt.Frame;
  6 import java.awt.GridLayout;
  7 import java.awt.Panel;
  8 import java.awt.TextField;
  9 import java.awt.event.ActionEvent;
 10 import java.awt.event.ActionListener;
 11 import java.awt.event.MouseEvent;
 12 import java.awt.event.MouseListener;
 13 
 14 public class Calculator extends Frame implements ActionListener,MouseListener {
 15      /**
 16       * button上的名字
 17       */
 18      private final String KEY[] = {"7","8" ,"9" ,"/" ,"4" ,"5" ,"6" ,"*" ,"1" ,"2" ,"3" ,"-" ,"0" ,"." ,"C" ,"+" ,"+/-" ,"%" ,"←" ,"=" };
 19      /**
 20       * 创建一个button数组
 21       */
 22      private Button key[] = new Button[ KEY. length];
 23      
 24      /**
 25       * 计算结果的文本框
 26       */
 27      private TextField tf = new TextField( "0");
 28      /** 标志用户按的是否是整个表达式的第一个数字,或者是运算符后的第一个数字*/
 29      private boolean firstNum = true;
 30      /**计算的中间结果。*/
 31      private double resultNum = 0.0;
 32      /**当前运算的运算符*/
 33      private String operator = "=";
 34      /**操作是否合法*/
 35      private boolean operateValidFlag = true;
 36      
 37 
 38      
 39      /**
 40       * 创建布局以及添加组件
 41       */
 42      public void additionLayout(){
 43            //构造一个有标题的构造方法
 44           Frame f = new Frame( "计算器");
 45            //定义一个窗口事件监听器用于关闭窗口
 46           f.addWindowListener( new MyWindowListener());
 47            //放button的面板
 48           Panel p = new Panel();
 49           Panel p2 = new Panel();
 50            //定义panel的布局方式
 51           p.setLayout( new GridLayout(5,4,5,5));
 52           p2.setLayout( new GridLayout(1,1,5,5));
 53            //使文本框不可编辑
 54            tf.setEditable( false);
 55           
 56            //用for循环创建button并加入到面板中
 57            for( int i = 0;i< KEY. length;i++){
 58                key[i] = new Button( KEY[i]);
 59                key[i].setBackground(Color. cyan);
 60               p.add( key[i]);
 61           }
 62            //为所有的button注册事件监听器
 63            for ( int i = 0; i < KEY. length; i++) {
 64                key[i].addActionListener( this);
 65                key[i].addMouseListener( this);
 66           }
 67            tf.setPreferredSize( new Dimension(20,30));
 68           p2.add( tf);
 69           f.add(p,BorderLayout. CENTER);
 70           f.add(p2,BorderLayout. NORTH);
 71           f.setSize(333,235);  //设置窗口大小
 72           f.setLocation(550, 200); //设置窗口的初始位置
 73           f.setResizable( false);   //不可改变窗口大小
 74           f.setVisible( true);   //设置窗口可见
 75      }
 76      
 77      /**
 78       * 监听器处理事件
 79       */
 80      @Override
 81      public void actionPerformed(ActionEvent e) {
 82           String label = e.getActionCommand();
 83            if( "0123456789.".indexOf(label)>=0){
 84                //用户按了数字键
 85               handleNumber(label);
 86           } else if(label.equals( KEY[14])){
 87                //用户按了C键
 88               handleC();
 89           } else if (label.equals( KEY[18])) {
 90                // 用户按了"Backspace"键
 91               handleBackspace();
 92           } else{
 93                //用户按了运算符键
 94               handleOperator(label);
 95           }
 96      }
 97      /**
 98       * 处理数字键与小数点被按下的事件
 99       *
100       */
101      private void handleNumber(String num){
102            if( firstNum){
103                //输入第一个数字
104                tf.setText(num);
105           } else if((num.equals( ".")) && (tf.getText().indexOf( ".") < 0)){
106                // 输入的是小数点,并且之前没有小数点,则将小数点附在结果文本框的后面
107                tf.setText( tf.getText() + ".");
108           } else if(!num.equals( ".")){
109                // 如果输入的不是小数点,则将数字附在结果文本框的后面
110                tf.setText( tf.getText() + num);
111           }
112           
113            firstNum = false;
114      }
115      
116      /**
117       * 处理C键被按下的事件
118       */
119      private void handleC(){
120            // 初始化计算器的各种值
121                     tf.setText( "0");
122                     firstNum = true;
123                     operator = "=";
124      }
125      
126      /**
127       * 处理Backspace键被按下的事件
128       */
129      private void handleBackspace() {
130           String text = tf.getText();
131            int i = text.length();
132            if (i > 0) {
133                // 退格,将文本最后一个字符去掉
134               text = text.substring(0, i - 1);
135                if (text.length() == 0) {
136                     // 如果文本没有了内容,则初始化计算器的各种值
137                     tf.setText( "0");
138                     firstNum = true;
139                     operator = "=";
140               } else {
141                     // 显示新的文本
142                     tf.setText(text);
143               }
144           }
145      }
146      
147      /**
148       * 处理运算符键被按下的事件
149       */
150      private void handleOperator(String oper){
151            if ( operator.equals( "/")) {
152                // 除法运算
153                // 如果当前结果文本框中的值等于0
154                if (getNumberFromText() == 0.0) {
155                     // 操作不合法
156                     operateValidFlag = false;
157                     tf.setText( "除数不能为零" );
158               } else {
159                     resultNum /= getNumberFromText();
160               }
161           } else if ( operator.equals( "+")) {
162                // 加法运算
163                resultNum += getNumberFromText();
164           } else if ( operator.equals( "-")) {
165                // 减法运算
166                resultNum -= getNumberFromText();
167           } else if ( operator.equals( "*")) {
168                // 乘法运算
169                resultNum *= getNumberFromText();
170           } else if ( operator.equals( "=")) {
171                // 赋值运算
172                resultNum = getNumberFromText();
173           } else if ( operator.equals( "+/-")) {
174                // 正数负数运算
175                resultNum = resultNum * (-1);
176           } else if ( operator.equals( "%")) {
177                // 百分号运算,除以100
178                resultNum = resultNum / 100;
179           }
180            if ( operateValidFlag) {
181                // 双精度浮点数的运算
182                long t1;
183                double t2;
184               t1 = ( long) resultNum;
185               t2 = resultNum - t1;
186                if (t2 == 0) {
187                     tf.setText(String. valueOf(t1));
188               } else {
189                     tf.setText(String. valueOf(resultNum));
190               }
191           }
192            // 运算符等于用户按的按钮
193            operator = oper;
194            firstNum = true;
195            operateValidFlag = true;
196      }
197      
198      /**
199       * 从文本框中获取数字
200       */
201      private double getNumberFromText() {
202            double result = 0;
203            try {               //异常捕获
204               result = Double.valueOf(tf.getText()).doubleValue();
205           } catch (NumberFormatException e) {
206           }
207            return result;
208      }
209 
210      //鼠标进入按钮时变为黄色
211      @Override
212      public void mouseEntered(MouseEvent e) {
213           Button b = (Button)e.getSource();
214           b.setBackground(Color. yellow);
215      }
216      //鼠标离开按钮时恢复颜色
217      @Override
218      public void mouseExited(MouseEvent e) {
219           Button b = (Button)e.getSource();
220           b.setBackground(Color. CYAN);
221      }
222      //鼠标在按钮上按下时变为红色
223      @Override
224      public void mousePressed(MouseEvent e) {
225           Button b = (Button)e.getSource();
226           b.setBackground(Color. red);
227      }
228      //鼠标在按钮上释放时恢复颜色
229      @Override
230      public void mouseReleased(MouseEvent e) {
231           Button b = (Button)e.getSource();
232           b.setBackground(Color. CYAN);
233           
234           
235      }
236 
237      @Override
238      public void mouseClicked(MouseEvent arg0) {
239            // TODO Auto-generated method stub
240           
241      }
242      
243      
244 
245 
246 /**
247  * 测试类
248  *
249  */
250      public static void main(String[] args) {
251           Calculator c = new Calculator();
252           c.additionLayout();
253      }
254      
255 }
Calculator

 

posted @ 2015-10-02 17:37  卑微幻想家  阅读(298)  评论(0编辑  收藏  举报