Simple Calculator GUI - JavaFx

  • I learned Java last semester, and the teacher assigned a homework - write a simple calculator with JavaFx, after many revisions, from 1.0 to 4.0, I managed to get by, although there are some small mistakes in it, but I don't think about it now Go change it...
    let's do it first.

code show as below

package Task2;

import static java.lang.Math.round;
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.layout.Border;
import javafx.scene.layout.GridPane;
import javafx.scene.text.Font;
import javafx.stage.Stage;

/**
 *
 * @author h
 */
public class Counter4 extends Application implements EventHandler<ActionEvent>{
    
    
    Button[] btn = new Button[20];
    TextField txt, txt2;
    String input;
    double[] num = new double[10];
    char[] ops = new char[8];
    int count=0;
    int start=0;
    double res=0;
    int len;
    String myop = "%+-x/";
    
    public static void main(String[] args) {
    
    
        launch(args);
    }
    @Override
    public void start(Stage stage){
    
    
        GridPane root = new GridPane();
        root.setStyle("-fx-background-color:linear-gradient(to bottom right,#ff33aa,#ffff00)");
        root.setPadding(new Insets(2, 1, 8, 1));
        root.setAlignment(Pos.BOTTOM_CENTER);
        root.setHgap(1);
        root.setVgap(2);        
        Font font = new Font("Arial", 16);
        
        txt = new TextField();
        txt.setFont(font);
        txt.setAlignment(Pos.TOP_RIGHT);
        txt.setEditable(false);
        txt.setBorder(Border.EMPTY);
        //TextField.wordWrap(true);
        txt2 = new TextField();
        txt2.setFont(Font.font(18));
        txt2.setAlignment(Pos.CENTER_RIGHT);
        txt2.setEditable(false);
        txt2.setPromptText("result");
        GridPane.setColumnSpan(txt, 4);
        GridPane.setColumnSpan(txt2, 4);
        //GridPane.setRowSpan(txt, 2);
        GridPane.setMargin(txt, new Insets(0, 0, 3, 0));
        root.add(txt, 0, 0);
        root.add(txt2, 0, 1);
        Label lab = new Label("@hcf");
        root.add(lab, 3, 7);
        GridPane.setHalignment(lab, HPos.RIGHT);
        
        int num = 8;
        for(int row=3;row<6;row++){
    
    
            for(int col=0;col<3;col++){
    
    
                btn[num] = new Button(String.valueOf(num+1));
                btn[num].setPrefSize(80, 50);
                btn[num].setFont(font);
                root.add(btn[num], col, row);
                btn[num].setOnAction(this);
                num--;
            }
        }
        num = 9;
        String[] tag = {
    
    "M","del","C","%","0",".","=","/","+","-","x"};
        for(int j=0;j<4;j++){
    
    
            btn[num] = new Button(tag[j]);
            btn[num+1] = new Button(tag[j+4]);
            btn[num].setPrefSize(80, 50);
            btn[num+1].setPrefSize(80, 50);
            btn[num].setFont(font);
            btn[num+1].setFont(font);
            root.add(btn[num], j, 2);
            root.add(btn[num+1], j, 6);
            btn[num].setOnAction(this);
            btn[num+1].setOnAction(this);
            num = num+2;
        }        
        for(int i=3;i<6;i++){
    
    
            btn[num] = new Button(tag[i+5]);
            root.add(btn[num], 3, i);
            btn[num].setPrefSize(80, 50);
            btn[num].setFont(font);
            btn[num].setOnAction(this);
            num++;
        }
      
        Scene scene = new Scene(root, 330, 400);
        stage.setScene(scene);
        stage.setTitle("Counter4.0");
        stage.getIcons().add(new Image("Counter.jpg"));
        stage.setResizable(false);
        stage.show();
    }
    @Override
    public void handle(ActionEvent event){
    
    
        Button btnClicked= (Button) event.getSource();//获得事件源
        String op=btnClicked.getText();
        switch(op){
    
    
            case "0":
                len = txt.getText().length();
                if(txt.getText(start, len).equals("0")){
    
    
                    break;
                }
                txt.setText(txt.getText()+"0");break;
            case "1":
                txt.setText(txt.getText()+"1");break;
            case "2":
                txt.setText(txt.getText()+"2");break;
            case "3":
                txt.setText(txt.getText()+"3");break;
            case "4":
                txt.setText(txt.getText()+"4");break;
            case "5":
                txt.setText(txt.getText()+"5");break;
            case "6":
                txt.setText(txt.getText()+"6");break;
            case "7":
                txt.setText(txt.getText()+"7");break;
            case "8":
                txt.setText(txt.getText()+"8");break;
            case "9":
                txt.setText(txt.getText()+"9");break;
            case ".":
                len = txt.getText().length();
                if(txt.getText(len-1, len).equals(".")||len==0){
    
    
                    break;
                }
                else if(txt.getText(start, len).indexOf(".")!=-1){
    
    
                    break;
                }
                else{
    
    
                    txt.setText(txt.getText()+".");
                }break;
            case "C":                
                txt.setText("");break;
            case "del":                
                len = txt.getText().length();
                if(len==0)
                    break;
                txt.setText(txt.getText(0, len-1));break;
            case "M"://将得到的结果变成下次计算的数值
                txt.setText(txt2.getText());
                txt2.setText("");break;
            case "/":                                
                len = txt.getText().length();
                if(len==0)break;//若未输入数字,则不输入除号
                else if(myop.contains(txt.getText(len-1, len))){
    
    
                    break;
                }   
                txt.setText(txt.getText()+"/");
                num[count]=Double.valueOf(txt.getText(start, len));                
                start=len+1;                
                ops[count]='/';
                count++;break;
            case "x":  
                if(len==0)
                    break;
                len = txt.getText().length();
                if(myop.contains(txt.getText(len-1, len))){
    
    
                    break;
                }           
                txt.setText(txt.getText()+"x");
                num[count]=Double.valueOf(txt.getText(start, len));
                start=len+1;                
                ops[count]='*';
                count++;break;  
            case "+":                
                len = txt.getText().length();
                if(len==0)
                    break;
                if(myop.contains(txt.getText(len-1, len))){
    
    
                    break;
                }            
                txt.setText(txt.getText()+"+");
                num[count]=Double.valueOf(txt.getText(start, len));
                start=len+1;                
                ops[count]='+';
                count++;break;
            case "-":                
                len = txt.getText().length();
                if(len==0)
                    break;
                if(myop.contains(txt.getText(len-1, len))){
    
    
                    break;
                }          
                txt.setText(txt.getText()+"-");
                num[count]=Double.valueOf(txt.getText(start, len));
                start=len+1;                
                ops[count]='-';
                count++;break;  
            case "%":                
                len = txt.getText().length();
                if(len==0)
                    break;
                if(myop.contains(txt.getText(len-1, len))){
    
    
                    break;
                }         
                txt.setText(txt.getText()+"%");
                num[count]=Double.valueOf(txt.getText(start, len));
                start=len+1;                
                ops[count]='%';
                count++;break;
            case "=":
                len = txt.getText().length();
                num[count]=Double.valueOf(txt.getText(start, len));                
                for(int i=0;i<count;i++){
    
    
                    if(ops[i]=='*'){
    
    
                        num[i+1]=num[i]*num[i+1];
                        num[i]=0;
                        ops[i]='+';
                        if(i>0&&ops[i-1]=='-'){
    
    
                            ops[i]='-';
                        }
                    }
                    else if(ops[i]=='/'){
    
    
                        if(num[i+1]==0){
    
    //除数为零                            
                            break;
                        }
                        num[i+1]=num[i]/num[i+1];
                        ops[i]='+';
                        num[i]=0;
                        if(i>0&&ops[i-1]=='-'){
    
    
                            ops[i]='-';
                        }
                    }
                    else if(ops[i]=='%'){
    
    
                        num[i+1]=round(num[i])%round(num[i+1]);
                        ops[i]='+';
                        num[i]=0;
                        if(i>0&&ops[i-1]=='-'){
    
    
                            ops[i]='-';
                        }
                    }
                }
                res=num[0];
                for(int j=0;j<count;j++){
    
    
                    if(ops[j]=='+'){
    
    
                       res+=num[j+1]; 
                    }
                    else{
    
    
                        res-=num[j+1];
                    }
                }
                txt2.setText(String.valueOf(res));
                for(int a=0;a<count;a++){
    
    
                    num[a]=0;
                    ops[a]='\0';
                }
                num[count]=0;
                count=0;
                res=0;
                start=0;
                break;
            default:break;
        }
    }
}

operation result

insert image description here

  • Small thought : Actually, I personally like to make GUI interface. Although the process is very troublesome, the effect is still very good!

Guess you like

Origin blog.csdn.net/m0_50115641/article/details/114683115