简易计算器GUI——JavaFx

  • 上学期学习了Java,老师布置了个作业——用JavaFx写一个简易计算器,经过多次修改,从1.0改到4.0,总算勉强过的去,虽然里面也有些小的错误,但现在没想去改……
    就先这样吧。

代码如下

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;
        }
    }
}

运行结果

在这里插入图片描述

  • 小感想:其实我个人还是特别喜欢做GUI界面的,虽然过程很麻烦,但做出效果来的感觉还是很好滴!
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!下面是一个简单的JavaFX计算器的示例代码: ```java import javafx.application.Application; import javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.TextField; import javafx.scene.layout.GridPane; import javafx.stage.Stage; public class SimpleCalculator extends Application { private TextField display; @Override public void start(Stage primaryStage) { primaryStage.setTitle("Simple Calculator"); GridPane grid = new GridPane(); grid.setPadding(new Insets(10)); grid.setHgap(5); grid.setVgap(5); display = new TextField(); display.setPrefWidth(200); display.setEditable(false); grid.add(display, 0, 0, 4, 1); String[] buttons = { "7", "8", "9", "/", "4", "5", "6", "*", "1", "2", "3", "-", "0", ".", "=", "+" }; int row = 1; int col = 0; for (String button : buttons) { Button btn = new Button(button); btn.setPrefSize(50, 50); btn.setOnAction(e -> handleButtonClick(button)); grid.add(btn, col, row); col++; if (col > 3) { col = 0; row++; } } Scene scene = new Scene(grid); primaryStage.setScene(scene); primaryStage.show(); } private void handleButtonClick(String button) { if (button.equals("=")) { evaluateExpression(); } else { display.setText(display.getText() + button); } } private void evaluateExpression() { String expression = display.getText(); try { double result = Calculator.evaluate(expression); display.setText(Double.toString(result)); } catch (Exception e) { display.setText("Error"); } } public static void main(String[] args) { launch(args); } } ``` 注意:这只是一个简单的示例,实际上并没有实现完整的计算功能。你需要自己实现 Calculator 类,用于计算表达式的结果。你可以根据需要进行扩展和修改。希望对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值