Я пытаюсь написать приложение-калькулятор с помощью javaFX, и у меня возникла проблема. Я пытаюсь написать метод, который выполняет фактические вычисления, но у меня возникают некоторые трудности. Написанный мной метод находится в приведенном ниже коде. Он отлично выполняет первый расчет, но когда вы пытаетесь добавить к расчету, все идет не так. Я чувствую, что написал это совершенно неправильно. Любая помощь приветствуется.

Рассматриваемый метод:

public void calculate() {
        if(result != 0) {
            System.out.println(finalResult);
            switch (operatorPressed) {
                case '+':
                    result = result + numberPressed;
                    setFinalResult(result);
                    System.out.println(operatorPressed);
                case '-':
                    result = result - numberPressed;
                case '*':
                    result = result * numberPressed;
                case '/':
                    result = result / numberPressed;
            }
        }
        else {
            result = numberPressed;
        }
    }

Полный калькулятор Класс двигателя:

package sample;

public class CalculatorEngine {

    

    private double numberPressed = 0;
    private double result = 0;
    public double finalResult;
    public char operatorPressed;


    public double getFinalResult() {
        return finalResult;
    }

    public void setFinalResult(double finalResult) {
        this.finalResult = finalResult;
    }

    public void setNumberPressed(double number) {
        numberPressed = number;
    }

    public void setOperatorPressed(char operator) {
        operatorPressed = operator;
    }

    public void calculate() {
        if(result != 0) {
            System.out.println(finalResult);
            switch (operatorPressed) {
                case '+':
                    result = result + numberPressed;
                    setFinalResult(result);
                    System.out.println(operatorPressed);
                case '-':
                    result = result - numberPressed;
                case '*':
                    result = result * numberPressed;
                case '/':
                    result = result / numberPressed;
            }
        }
        else {
            result = numberPressed;
        }
    }
}

Полный класс контроллера:

package sample;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.fxml.Initializable;

import java.io.IOException;
import java.util.ArrayList;
import java.util.ResourceBundle;
import java.net.URL;


public class Controller {
    @FXML
    private Button btnSix;

    @FXML
    private Button btnEight;

    @FXML
    private Button btnNine;

    @FXML
    private Button btnDivide;

    @FXML
    private Button btnFour;

    @FXML
    private Button btnFive;

    @FXML
    private Button btnSeven;

    @FXML
    private Button btnMultiply;

    @FXML
    private Button btnOne;

    @FXML
    private Button btnTwo;

    @FXML
    private Button btnThree;

    @FXML
    private Button btnSubtract;

    @FXML
    private Button btnZero;

    @FXML
    private Button btnDecimalPoint;

    @FXML
    private Button btnEquals;

    @FXML
    private Button btnPlus;

    @FXML
    private Label txtCalcDisplay;

    private ArrayList<String> outputList = new ArrayList<>();
    private CalculatorEngine engine = new CalculatorEngine();
    private String output = "";
    private double finalResult;

    private final int oneValue = 1;
    private final int twoValue = 2;
    private final int threeValue = 3;
    private final int fourValue = 4;
    private final int fiveValue = 5;
    private final int sixValue = 6;
    private final int sevenValue = 7;
    private final int eightValue = 8;
    private final int nineValue = 9;
    private final int zeroValue = 0;


    //@Override
    //public void initialize(URL url, ResourceBundle resourceBundle) {
    //}

    public void organiseOutput()
    {
        for(int i = 0; i <= outputList.size()-1; i++) {
           output = output.concat(outputList.get(i));
        }
    }

    public void displayOutput()
    {
        if(outputList.get(outputList.size()-1).equals("=")) {
            txtCalcDisplay.setText(String.valueOf(engine.getFinalResult()));
        }
        else if(outputList.get(outputList.size()-1).equals("-") || outputList.get(outputList.size()-1).equals("+") || outputList.get(outputList.size()-1).equals("*") || outputList.get(outputList.size()-1).equals("/")) {
            txtCalcDisplay.setText("");
        }
        else {
            //output = "";
            txtCalcDisplay.setText("");
            txtCalcDisplay.setText(output);
        }

    }

    public void onOneButtonClicked(ActionEvent event) throws IOException
    {
        outputList.add("1");
        output = String.valueOf(oneValue);
        displayOutput();
        engine.setNumberPressed(oneValue);
        engine.calculate();

    }

    public void onTwoButtonClicked(ActionEvent event) throws IOException
    {
        outputList.add("2");
        output = String.valueOf(twoValue);
        displayOutput();
        engine.setNumberPressed(twoValue);
    }

    public void onThreeButtonClicked(ActionEvent event) throws IOException
    {
        outputList.add("3");
        output = String.valueOf(threeValue);
        displayOutput();
        engine.setNumberPressed(threeValue);
    }

    public void onFourButtonClicked(ActionEvent event) throws IOException
    {
        outputList.add("4");
        output = String.valueOf(fourValue);
        displayOutput();
        engine.setNumberPressed(fourValue);
    }

    public void onFiveButtonClicked(ActionEvent event) throws IOException
    {
        outputList.add("5");
        output = String.valueOf(fiveValue);
        displayOutput();
        engine.setNumberPressed(fiveValue);
    }

    public void onSixButtonClicked(ActionEvent event) throws IOException
    {
        outputList.add("6");
        output = String.valueOf(sixValue);
        displayOutput();
        engine.setNumberPressed(sixValue);
    }

    public void onSevenButtonClicked(ActionEvent event) throws IOException
    {
        outputList.add("7");
        output = String.valueOf(sevenValue);
        displayOutput();
        engine.setNumberPressed(sevenValue);
    }

    public void onEightButtonClicked(ActionEvent event) throws IOException
    {
        outputList.add("8");
        output = String.valueOf(eightValue);
        displayOutput();
        engine.setNumberPressed(eightValue);
    }

    public void onNineButtonClicked(ActionEvent event) throws IOException
    {
        outputList.add("9");
        output = String.valueOf(nineValue);
        displayOutput();
        engine.setNumberPressed(nineValue);
    }

    public void onZeroButtonClicked(ActionEvent event) throws IOException
    {
        outputList.add("0");
        output = String.valueOf(zeroValue);
        displayOutput();
        engine.setNumberPressed(zeroValue);
    }

    public void onAddButtonClicked(ActionEvent event) throws IOException
    {
        outputList.add("+");
        output = "+";
        displayOutput();
        engine.setOperatorPressed('+');
        engine.calculate();
    }

    public void onMinusButtonClicked(ActionEvent event) throws IOException
    {
        outputList.add("-");
        output = "-";
        displayOutput();
        engine.setOperatorPressed('-');
        engine.calculate();
    }

    public void onDivideButtonClicked(ActionEvent event) throws IOException
    {
        outputList.add("/");
        output = "/";
        displayOutput();
        engine.setOperatorPressed('/');
        engine.calculate();
    }

    public void onMultiplyButtonClicked(ActionEvent event) throws IOException
    {
        outputList.add("*");
        output = "*";
        displayOutput();
        engine.setOperatorPressed('*');
        engine.calculate();
    }

    public void onDecimalButtonClicked(ActionEvent event) throws IOException
    {
        outputList.add(".");
        output = ".";
        displayOutput();
        engine.setOperatorPressed('.');
        engine.calculate();
    }

    public void onEqualsButtonClicked(ActionEvent event) throws IOException
    {
        outputList.add("=");
        output = "=";
        engine.calculate();
        displayOutput();
    }
}

0
Leonard 8 Июн 2021 в 18:18

2 ответа

Лучший ответ

Вам нужен break; после каждого случая.

 public void calculate() {
    if(result != 0) {
        System.out.println(finalResult);
        switch (operatorPressed) {
            case '+':
                result = result + numberPressed;
                setFinalResult(result);
                System.out.println(operatorPressed);
                break;
            case '-':
                result = result - numberPressed;
                break;
            case '*':
                result = result * numberPressed;
                break;
            case '/':
                result = result / numberPressed;
                break;
        }
    }
3
Lucadmin 8 Июн 2021 в 15:50

Оператор переключения традиций требует break: в конце каждого случая. Начиная с java 12 существует более новый синтаксис, в котором используется -> вместо :.

        switch (operatorPressed) {
            case '+' ->
                result += numberPressed;
                setFinalResult(result);
                System.out.println(operatorPressed);
            case '-' ->
                result -= numberPressed;
            case '*' ->
                result *= numberPressed;
            case '/' ->
                result /= numberPressed;
        }

В исходном коде - попадет в * и /.

Еще один совет: switch также может работать со строками: switch ("...") { case "CE" -> ....

2
Joop Eggen 8 Июн 2021 в 15:46