1112zx

package test;
import javax.swing.;
import java.awt.
;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.HashMap;
import java.util.Stack;

/**

  • Created by zxx on 2020/10/15.
    */
    public class Calculator extends JFrame{

    private Stack operandStack= new Stack<>();
    private Stack operatorStack = new Stack<>();

    private Calculator(){

     setTitle("计算器");
     setSize(266,340);
     //setSize(400,540);
     Container c=getContentPane();
     c.setLayout(null);
    
    
     JTextArea jt=new JTextArea(100,100);
     jt.setFont(new Font("Aria",Font.BOLD,32));
     jt.setLineWrap(true);
     JScrollPane sp=new JScrollPane(jt);
     jt.setCaretPosition(jt.getDocument().getLength());
     sp.setBounds(0,0,250,100);
     c.add(sp);
    
     JPanel p=new JPanel();
     p.setLayout(new GridLayout(5,4,0,0));
    
     p.setBounds(0,100,250,200);
     String[] num={"(",")","AC","/","7","8","9","*","4","5","6","-","1","2","3","+","0",".","DEL","="};
     JButton[] jb=new JButton[20];
     for(int i=0;i<20;i ++ ){
         jb[i]=new JButton(num[i]);
         p.add(jb[i]);
     }
     c.add(p);
    
     for(int i=0;i<18;i  ++){
         if(i!=2){
             final int j=i;
             jb[i].addActionListener(e-> jt.append(num[j]));
         }
     }
    
     jb[2].addActionListener(e->{
         jt.setText("");
         operandStack.clear();
         operatorStack.clear();
     });
     jb[18].addActionListener(e->{
         try{
             jt.setText(jt.getText().substring(0,jt.getText().length()-1));
         }catch(Exception ignored) { }//忽略这个异常   IDEA就是好用!!!
     });
     jb[19].addActionListener(e->{
         try{
             double x= calculate(jt.getText()+ "#");
             jt.setText("");
             jt.append(String.valueOf(x));
         }catch(Exception ex){
             if(ex.getMessage()==null)
                 jt.setText("ERROR!");
             else
                 jt.setText(ex.getMessage());
         }
     });
     //禁止文本域的enter换行
     KeyStroke enter = KeyStroke.getKeyStroke("ENTER");
     jt.getInputMap().put(enter, "none");
    
     this.getRootPane().setDefaultButton(jb[19]);
    
     c.addKeyListener(new KeyAdapter() {
         @Override
         public void keyTyped(KeyEvent e) 
         {
         	
         } 
         public void keyPressed(KeyEvent e)			//键盘按键监听
         {
         	char label=e.getKeyChar();
         	String k=String.valueOf(label);
         	if(label==KeyEvent.VK_ENTER)
         	{
         		calculate();
         	}
         	else if(label==KeyEvent.VK_BACK_SPACE) 
         	{
         		String s = jt.getText();
         		if(s!=null) 
         		{
         			calculate();				//调用定义的处理←方法
         		}else 
         		{
         			jt.setText(s);
         		}			
         	}
         	else
         	{
         		calculate(k);					//按下数字和运算符号的叠加
         	}
         }	
         public void keyReleased(KeyEvent e) 
         {
         	
         }
    
     });
    
    
     setVisible(true);
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    

    }

    private void calculate(){
    String b = operatorStack.pop();
    double c = operandStack.pop();
    double d = operandStack.pop();
    double e;
    if (b.equals("+")) {
    e = d + c;
    operandStack.push(e);
    }
    if (b.equals("-")) {
    e = d - c;
    operandStack.push(e);
    }
    if (b.equals("*")) {
    e = d * c;
    operandStack.push(e);
    }
    if (b.equals("/")) {
    if(c==0)
    throw new ArithmeticException("DivideByZero!");//不可修改为Exception
    // Exception的异常是必须处理的,是受控异常;而ArithmeticException 不是必须处理的 ,受控异常必须强制处理
    e = d / c;
    operandStack.push(e);
    }
    }

    private Double calculate(String text){
    HashMap<String,Integer> precede=new HashMap<>();
    precede.put("(",0);
    precede.put(")",0);
    precede.put("/",2);
    precede.put("*",2);
    precede.put("-",1);
    precede.put("+",1);
    precede.put("#",0);

     operatorStack.push("#");
    
     int flag=0;
     for(int i=0;i<text.length();i++  ){
         String a=String.valueOf(text.charAt(i));
         if(!a.matches("[0-9.]")){
             if(flag!=i)
                 operandStack.push(Double.parseDouble(text.substring(flag,i)));
             flag=i+ 1;
             while(!(a.equals("#")&&operatorStack.peek().equals("#"))){
                 if(precede.get(a)>precede.get(operatorStack.peek())||a.equals("(")){
                     operatorStack.push(a);
                     break;
                 }else {
                     if(a.equals(")")) {
                         while(!operatorStack.peek().equals("("))
                             calculate();
                         operatorStack.pop();
                         break;
                     }
                     calculate();
                 }
             }
    
         }
     }
    
     return(operandStack.pop());
    

    }

    public static void main(String[] args){
    new Calculator();
    }
    }

分类:

Java

技术点:

相关文章: