javafx实现计算器及计算日期差

首先创建package计算器,然后创建Calculate类和CalculatorUI类,运行CalculatorUI即可

计算类Calculate

使用堆栈实现优先级计算,传入式子,返回结果

// An highlighted block
package 计算器;
import java.util.List;
import java.util.Stack;
import java.util.ArrayList;
public class Calculate {
		public static Double fun(Double n) {
			Double sum=1.0;
			for(int i=1;i<=n;i++)
				sum*=i;
			return sum;
		}
		public String cal(String str1) {
	        List<String> strlist = new ArrayList<>();
	        StringBuilder str2=new StringBuilder(str1);
	        str2.insert(0,"0");
	        String ss=""+str2;
	        char[] ar = ss.toCharArray();
	        int index;
	        for(int i=0;i<ss.length();i++) {
	        	if(ar[i]=='(') {
	        		index=i;
	        		while(index<ss.length()) {
	        			if(ar[index]=='-')
	        				str2.insert(index,"0");
	        			if(ar[index]==')')
	        				break;
	        			index++;
	        		}
	        	}
	        }
	        String str=""+str2;
	        char[] Arr = str.toCharArray();
	        StringBuffer bufstr = new StringBuffer();
	        for (int i=0;i<str.length();i++) {
	            if(Arr[i]=='.') {
	            	bufstr.append(Arr[i]);
	            }
	            else if(Arr[i]>='0' && Arr[i]<='9') {
	            	bufstr.append(Arr[i]);
	            }
	            else if(Arr[i]==' ') {
	                continue;
	            }
	            else if(Arr[i]=='+' || Arr[i]=='-' || Arr[i]=='*' || Arr[i]=='/' || Arr[i]=='(' || Arr[i]==')'|| Arr[i]=='^' || Arr[i]=='!') {
	                if (bufstr.length() > 0) {
	                    strlist.add(bufstr.toString());
	                    bufstr.setLength(0);
	                }
	                strlist.add(Arr[i] + "");
	            }
	            else if(Arr[i]=='t'&&Arr[i+1]=='a'&&Arr[i+2]=='n') {
	            	i+=2;
	            	strlist.add("tan");
	            }
	            else if(Arr[i]=='s'&&Arr[i+1]=='i'&&Arr[i+2]=='n') {
	                strlist.add("sin");
	                i+=2;
	            }
	            else if(Arr[i]=='c'&&Arr[i+1]=='o'&&Arr[i+2]=='s') 
	                strlist.add("cos");
	            else if(Arr[i]=='l'&&Arr[i+1]=='n') {
	            	strlist.add("ln");
	            	i++;
	            }
	            else if(Arr[i]=='l'&&Arr[i+1]=='o'&&Arr[i+2]=='g') {
	            	strlist.add("log");
	            	i+=2;
	            }
	        }
	        if (bufstr.length()>0)
	            strlist.add(bufstr.toString());
	        List<String> strList = new ArrayList<>();
	        Stack<String> Stack = new Stack<>();
	        String dex;
	        for (String s : strlist) {
	            if (s.equals("(")) {
	                Stack.push(s);
	            }
	            else if (s.equals(")")) {
	                while (!(dex = Stack.pop()).equals("(")) {
	                    strList.add(dex);                    
	                }
	            }
	            
	            else if (s.equals("*") || s.equals("/")) {
	                while(!Stack.isEmpty()) {
	                	dex=Stack.peek();
	                    if (dex.equals("ln")||dex.equals("*") || dex.equals("/")||dex.equals("sin")||dex.equals("cos")||dex.equals("tan")||dex.equals("!")||dex.equals("^")) {
	                        Stack.pop();
	                        strList.add(dex);
	                    }
	                    else {
	                        break;
	                    }
	                }
	                Stack.push(s);
	            }
	            else if(s.equals("tan") || s.equals("sin") || s.equals("cos")) {
	                Stack.push(s);
	            }
	            else if(s.equals("ln")||s.equals("log")) {
	                Stack.push(s);
	            }
	            else if(s.equals("^")) {
	                while(!Stack.isEmpty()) {
	                	dex=Stack.peek();
	                    if (dex.equals("tan") || dex.equals("sin") || dex.equals("cos") ||dex.equals("!") ||dex.equals("^")||dex.equals("ln")) {
	                        Stack.pop();
	                        strList.add(dex);
	                    }
	                    else {
	                        break;
	                    }
	                }
	                Stack.push(s);
	            }
	            else if(s.equals("ln")){
	                Stack.push(s);
	            }
	            else if(s.equals("!")) {
	                while(!Stack.isEmpty()) {
	                	dex=Stack.peek();
	                    if (dex.equals("tan") || dex.equals("sin") || dex.equals("cos") ||dex.equals("!")) {
	                        Stack.pop();
	                        strList.add(dex);
	                    }
	                    else {
	                        break;
	                    }
	                }
	                Stack.push(s);
	            }
	            else if (s.equals("+") || s.equals("-")) {
	                while(!Stack.isEmpty()) {
	                	dex = Stack.peek();
	                    if (!dex.equals("(")) {
	                        Stack.pop();
	                        strList.add(dex);
	                    }
	                    else {
	                        break;
	                    }
	                }
	                Stack.push(s);
	            }
	            else {
	                strList.add(s);
	            }
	        }
	        while (!Stack.isEmpty())
	            strList.add(Stack.pop());
	        Stack<Double> newstack = new Stack<>();
	        for (String s : strList) {
	            if (s.equals("*") || s.equals("/") || s.equals("+") || s.equals("-") || s.equals("!") || s.equals("^") || s.equals("tan") ||s.equals("sin") ||s.equals("cos")||s.equals("ln")||s.equals("log") ) {
	                switch (s) {
	                case "-":{
	                	Double left = newstack.pop();
	                    Double right = newstack.pop();
	                    newstack.push(right-left);
	                    break;
	                }
	                case "+":{
	                	Double left = newstack.pop();
	                    Double right = newstack.pop();
	                	newstack.push(right+left);
	                    break;
	                }
	                case "*":{
	                	Double left = newstack.pop();
	                    Double right = newstack.pop();
	                	newstack.push(right*left);
	                    break;
	                }
	                case "tan":{
	                	Double number = newstack.pop();
	                	newstack.push(Math.tan(number));
	                	break;
	                }
	                case "sin":{
	                	Double number = newstack.pop();
	                	newstack.push(Math.sin(number));
	                	break;
	                }
	                case "cos":{
	                	Double number = newstack.pop();
	                	newstack.push(Math.cos(number));
	                	break;
	                }
	                case "!":{
	                	Double number = newstack.pop();
	                	newstack.push(fun(number));
	                	break;
	                }
	                case "^":{
	                	Double left = newstack.pop();
	                    Double right = newstack.pop();
	                    newstack.push(Math.pow(right,left ));
	                    break;
	                }
	                case "ln":{
	                	Double number = newstack.pop();
	                	newstack.push(Math.log(number)/Math.log(Math.E));
	                	break;
	                }
	                case "log":{
	                	Double left = newstack.pop();
	                	Double right = newstack.pop();
	                	newstack.push(Math.log(left)/Math.log(right));
	                	break;
	                }
	                case "/":
	                	Double left = newstack.pop();
	                    Double right = newstack.pop();
	                    if(left==0.0) {
	                    	System.out.println("ErrorDivided by zero ");
	                		System.exit(0);
	                    }
	                    Double number=right/left;
	                	newstack.push(number);
	                	break;
	                }
	            }
	            else {
	                newstack.push(Double.valueOf(s));
	            }
	        }
	        Double number=newstack.pop();
	        String outcome= String.format("%.4f", number);
	        return outcome;
		}
}

界面类CalculatorUI

// An highlighted block
package 计算器;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.Locale;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.DatePicker;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

public class CalculatorUI extends Application {
    private Stage stage;
    private DatePicker checkInDatePicker;
    private DatePicker checkOutDatePicker;
    private int index=0;
    private Group g = new Group();
    public static void main(String[] args) {
        Locale.setDefault(Locale.US);                  
        launch(args);
    }

    public void start(Stage stage) {
        this.stage = stage;
        this.stage.setWidth(565);
	    this.stage.setHeight(300);
	    this.stage.setResizable(false);
        stage.setTitle("计算器 ");
                           计算();日历();
        Scene scene =new Scene(g);
        stage.setScene(scene);
        stage.show();
    }
    
    private void 计算() {
    	TextArea ta = new TextArea(); // 创建文本域
	    ta.setPrefSize(280, 110);
	    ta.setWrapText(true);
	    ta.setStyle("-fx-text-fill:black");
	    ta.setStyle("-fx-font-family: 'SimHei';-fx-font-size: 20;");
	    g.getChildren().add(ta);
	    Calculate cal=new Calculate();
	    GridPane gridPane = new GridPane();
	    GridPane gridPane1 = new GridPane();
	    Button b0 = new Button("0");
	    b0.setPrefSize(140, 30);
	    b0.setLayoutX(0);
	    b0.setLayoutY(240);
	    Button b1 = new Button("1");
	    b1.setPrefSize(70, 30);
	    gridPane.add(b1, 0, 3);
	    Button b2 = new Button("2");
	    b2.setPrefSize(70, 30);
	    gridPane.add(b2, 1, 3);
	    Button b3 = new Button("3");
	    b3.setPrefSize(70, 30);
	    gridPane.add(b3, 2, 3);
	    Button b4 = new Button("4");
	    b4.setPrefSize(70, 30);
	    gridPane.add(b4, 0, 2);
	    Button b5 = new Button("5");
	    b5.setPrefSize(70, 30);
	    gridPane.add(b5, 1, 2);
	    Button b6 = new Button("6");
	    b6.setPrefSize(70, 30);
	    gridPane.add(b6, 2, 2);
	    Button b7 = new Button("7");
	    b7.setPrefSize(70, 30);
	    gridPane.add(b7, 0, 1);
	    Button b8 = new Button("8");
	    b8.setPrefSize(70, 30);
	    gridPane.add(b8, 1, 1);
	    Button b9 = new Button("9");
	    b9.setPrefSize(70, 30);
	    gridPane.add(b9, 2, 1);
	    Button badd = new Button("+");
	    badd.setPrefSize(70, 30);
	    gridPane.add(badd, 3, 3);
	    Button bsub = new Button("-");
	    bsub.setPrefSize(70, 30);
	    gridPane.add(bsub, 3, 2);
	    Button bmul = new Button("*");
	    bmul.setPrefSize(70, 30);
	    gridPane.add(bmul, 3, 1);
	    Button bdiv = new Button("/");
	    bdiv.setPrefSize(70, 30);
	    gridPane.add(bdiv, 3, 0);
	    Button bequ = new Button("=");
	    bequ.setPrefSize(70, 30);
	    bequ.setLayoutX(210);
	    bequ.setLayoutY(240);
	    Button bdel = new Button("X");
	    bdel.setPrefSize(70, 30);
	    gridPane.add(bdel, 2, 0);
	    Button bce = new Button("ce");
	    bce.setPrefSize(70, 30);
	    gridPane.add(bce, 0, 0);
	    Button bc = new Button("c");
	    bc.setPrefSize(70, 30);
	    gridPane.add(bc, 1, 0);
	    Button bspot = new Button(".");
	    bspot.setPrefSize(70, 30);
	    bspot.setLayoutX(140);
	    bspot.setLayoutY(240);
	    gridPane1.add(b0, 0, 0);
	    gridPane1.add(bspot, 1, 0);
	    gridPane1.add(bequ, 2, 0);
	    gridPane.setLayoutX(0);
	    gridPane.setLayoutY(120);
	    gridPane1.setLayoutX(0);
	    gridPane1.setLayoutY(240);
	    g.getChildren().addAll(gridPane,gridPane1);
	    gridPane.setGridLinesVisible(true);
	    gridPane1.setGridLinesVisible(true);
	    bspot.setOnAction(new EventHandler<ActionEvent>() {            
	        public void handle(ActionEvent event) {  
	        	String s=bspot.getText();
	        	String s1=ta.getText();
	        	if(index==0) {
	        		if(s1.length()==0)
	        			ta.appendText("");
	        		else if (Character.isDigit(s1.charAt(s1.length()-1)))
	        			ta.appendText(s);
	        	}
	        }
	    });
	    b0.setOnAction(new EventHandler<ActionEvent>() {            
	        public void handle(ActionEvent event) {  
	        	String s=b0.getText();
	        	if(index==0)
	        	ta.appendText(s);
	        	else {
	        		index=0;
	        		ta.setText("");
	        		ta.appendText(s);
	        	}
	        }
	    });
	    b1.setOnAction(new EventHandler<ActionEvent>() {            
	        public void handle(ActionEvent event) {  
	        	String s=b1.getText();
	        	ta.appendText(s);
	        }
	    });
	    b2.setOnAction(new EventHandler<ActionEvent>() {            
	        public void handle(ActionEvent event) {  
	        	String s=b2.getText();
	        	if(index==0)
		        	ta.appendText(s);
		        	else {
		        		index=0;
		        		ta.setText("");
		        		ta.appendText(s);
		        	}
	        }
	    });
	    b2.setOnAction(new EventHandler<ActionEvent>() {            
	        public void handle(ActionEvent event) {  
	        	String s=b3.getText();
	        	if(index==0)
		        	ta.appendText(s);
		        	else {
		        		index=0;
		        		ta.setText("");
		        		ta.appendText(s);
		        	}
	        }
	    });
	    b3.setOnAction(new EventHandler<ActionEvent>() {            
	        public void handle(ActionEvent event) {  
	        	String s=b3.getText();
	        	if(index==0)
		        	ta.appendText(s);
		        	else {
		        		index=0;
		        		ta.setText("");
		        		ta.appendText(s);
		        	}
	        }
	    });
	    b4.setOnAction(new EventHandler<ActionEvent>() {            
	        public void handle(ActionEvent event) {  
	        	String s=b4.getText();
	        	if(index==0)
		        	ta.appendText(s);
		        	else {
		        		index=0;
		        		ta.setText("");
		        		ta.appendText(s);
		        	}
	        }
	    });
	    b5.setOnAction(new EventHandler<ActionEvent>() {            
	        public void handle(ActionEvent event) {  
	        	String s=b5.getText();
	        	if(index==0)
		        	ta.appendText(s);
		        	else {
		        		index=0;
		        		ta.setText("");
		        		ta.appendText(s);
		        	}
	        }
	    });
	    b6.setOnAction(new EventHandler<ActionEvent>() {            
	        public void handle(ActionEvent event) {  
	        	String s=b6.getText();
	        	if(index==0)
		        	ta.appendText(s);
		        	else {
		        		index=0;
		        		ta.setText("");
		        		ta.appendText(s);
		        	}
	        }
	    });
	    b7.setOnAction(new EventHandler<ActionEvent>() {            
	        public void handle(ActionEvent event) {  
	        	String s=b7.getText();
	        	if(index==0)
		        	ta.appendText(s);
		        	else {
		        		index=0;
		        		ta.setText("");
		        		ta.appendText(s);
		        	}
	        }
	    });
	    b8.setOnAction(new EventHandler<ActionEvent>() {            
	        public void handle(ActionEvent event) {  
	        	String s=b8.getText();
	        	if(index==0)
		        	ta.appendText(s);
		        	else {
		        		index=0;
		        		ta.setText("");
		        		ta.appendText(s);
		        	}
	        }
	    });
	    b9.setOnAction(new EventHandler<ActionEvent>() {            
	        public void handle(ActionEvent event) {  
	        	String s=b9.getText();
	        	if(index==0)
		        	ta.appendText(s);
		        	else {
		        		index=0;
		        		ta.setText("");
		        		ta.appendText(s);
		        	}
	        }
	    });
	    badd.setOnAction(new EventHandler<ActionEvent>() {            
	        public void handle(ActionEvent event) {  
	        	String s=badd.getText();
	        	String s1=ta.getText();
	        	if(index==0) {
	        		if(s1.length()==0)
	        			ta.appendText("");
	        		else if (Character.isDigit(s1.charAt(s1.length()-1)))
	        			ta.appendText(s);
	        	}
	        	if(index==1) {
	        		int i=s1.length()-1;
	        		while (s1.charAt(i)!='=') {
	        			i--;
	        		}
	        		index=0;
	        		String s2=ta.getText(i+2,s1.length())+badd.getText();
	        		ta.setText(s2);
	        	}
	        }
	    });
	    bsub.setOnAction(new EventHandler<ActionEvent>() {            
	        public void handle(ActionEvent event) {  
	        	String s=bsub.getText();
	        	String s1=ta.getText(); 
	        	if(index==0) {
	        		if(s1.length()==0)
	        			ta.appendText("");
	        		else if (Character.isDigit(s1.charAt(s1.length()-1)))
	        			ta.appendText(s);
	        	}
	        	if(index==1) {
	        		int i=s1.length()-1;
	        		while (s1.charAt(i)!='=') {
	        			i--;
	        		}
	        		index=0;
	        		String s2=ta.getText(i+2,s1.length())+bsub.getText();
	        		ta.setText(s2);
	        	}
	        }
	    });
	    bmul.setOnAction(new EventHandler<ActionEvent>() {            
	        public void handle(ActionEvent event) {  
	        	String s=bmul.getText();
	        	String s1=ta.getText();  
	        	if(index==0) {
	        		if(s1.length()==0)
	        			ta.appendText("");
	        		else if (Character.isDigit(s1.charAt(s1.length()-1)))
	        			ta.appendText(s);
	        	}
	        	if(index==1) {
	        		int i=s1.length()-1;
	        		while (s1.charAt(i)!='=') {
	        			i--;
	        		}
	        		index=0;
	        		String s2=ta.getText(i+2,s1.length())+bmul.getText();
	        		ta.setText(s2);
	        	}
	        }
	    });
	    bdiv.setOnAction(new EventHandler<ActionEvent>() {            
	        public void handle(ActionEvent event) {  
	        	String s=bdiv.getText();
	        	String s1=ta.getText();  
	        	if(index==0) {
	        		if(s1.length()==0)
	        			ta.appendText("");
	        		else if (Character.isDigit(s1.charAt(s1.length()-1)))
	        			ta.appendText(s);
	        	}
	        	if(index==1) {
	        		int i=s1.length()-1;
	        		while (s1.charAt(i)!='=') {
	        			i--;
	        		}
	        		index=0;
	        		String s2=ta.getText(i+2,s1.length())+bdiv.getText();
	        		ta.setText(s2);
	        	}
	        }
	    });
	    bce.setOnAction(new EventHandler<ActionEvent>() {            
	        public void handle(ActionEvent event) {
	        	String s=ta.getText();int i;
	        	char[] arry = s.toCharArray();
	        	for( i=s.length()-1;i>=0;i--) {
	        		if(arry[i]=='+'||arry[i]=='-'||arry[i]=='*'||arry[i]=='/') {
	        			 break;
	        		}
	        	}
	        	if(index==0) {
	        		if(i!=-1)
	        			ta.deleteText(i+1,s.length());
	        		else
	        			ta.setText("");
	        	}
	        }
	    });
	    bc.setOnAction(new EventHandler<ActionEvent>() {            
	        public void handle(ActionEvent event) {  
	        	ta.setText("");
	        }
	    });
	    bdel.setOnAction(new EventHandler<ActionEvent>() {            
	        public void handle(ActionEvent event) {
	        	String s=ta.getText();
	        	if(index==0) {
	        		if(s.length()!=0)
	        			ta.deleteText(s.length()-1,s.length());
	        	}
	        }
	    });
	    bequ.setOnAction(new EventHandler<ActionEvent>() {            
	        public void handle(ActionEvent event) {
	        	String s=ta.getText();String s1=ta.getText();
	        	if(s.length()!=0) {
	        		if (Character.isDigit(s1.charAt(s1.length()-1))) {
	        			if(index==0) {
	        				String expression=ta.getText();
	        				ta.appendText("\n=\n"+cal.cal(expression));
	        			}
	        		index=1;
	        		}
	        	}
	       }
	    });
    	
    }
    
    private void 日历() {
        checkInDatePicker = new DatePicker();
        checkOutDatePicker = new DatePicker();
        checkInDatePicker.setValue(LocalDate.now());
        checkOutDatePicker.setValue(checkInDatePicker.getValue().plusDays(1));
        TextField tfs=new TextField();
        TextField tf=new TextField();
        GridPane gridPane = new GridPane();
        gridPane.setHgap(5);
        gridPane.setVgap(5);
        Label checkInlabe = new Label("计算两个日期之差");
        checkInlabe.setStyle("-fx-font-family: 'SimHei';-fx-font-size: 16;");
        gridPane.add(checkInlabe, 0, 0);
        Label checkInlabel = new Label("从");
        gridPane.add(checkInlabel, 0, 2);
        gridPane.add(checkInDatePicker, 0, 3);
        Label checkOutlabel = new Label("到");
        gridPane.add(checkOutlabel, 0, 4);
        gridPane.add(checkOutDatePicker, 0,5);
        Label las = new Label("差(年、月、日、周、天)");
        gridPane.add(las, 0,6); 
        tfs.setPrefSize(10, 30);
        gridPane.add(tfs, 0,7);
        Label la = new Label("差(天)");
        gridPane.add(la, 0,8);
        tf.setPrefSize(20, 30);
        gridPane.add(tf, 0,9);
        Button bcal=new Button("计算");
        bcal.setPrefSize(70, 33);
        gridPane.add(bcal, 0,11);
        bcal.setOnAction(new EventHandler<ActionEvent>() {            
	        public void handle(ActionEvent event) {

	        	long years=Math.abs(ChronoUnit.YEARS.between(
                        checkInDatePicker.getValue(), checkOutDatePicker.getValue()
                ));
	        	long months=Math.abs(ChronoUnit.MONTHS.between(
                        checkInDatePicker.getValue(), checkOutDatePicker.getValue()
                ));
	        	long days = Math.abs(ChronoUnit.DAYS.between(
                        checkInDatePicker.getValue(), checkOutDatePicker.getValue()
                ));
	        	long Months=months-12*years;
	        	long Weeks=(days-months*30)/7;
	        	long day=days-Weeks*7-Months*30;
	        	String ss=""+years+"年,"+Months+"月,"+Weeks+"周,"+day+"天";
	        	String s=""+days;
	        	tfs.setText(ss);
                tf.setText(s);
	        }
	    });
        gridPane.setLayoutX(350);
        gridPane.setLayoutY(0);
        g.getChildren().add(gridPane);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值