Кнопка возврата в JavaFX - PullRequest
2 голосов
/ 02 июля 2019

Я делаю проект калькулятора с использованием JavaFX. В моем калькуляторе была кнопка возврата. Я попробовал старый способ, что-то вроде этого:

strBuild.deleteCharAt(display.getText().length()-1);

Но это не сработало, возможно и из-за версий. Поэтому мне было интересно, можно ли каким-либо образом реализовать или создать кнопку возврата в JavaFX.

Это мой контроллер FXML:

@FXML
    void handleButtonAction(ActionEvent event) {

        if(start)
        {
            display.setText("");
            start = false;
        }
        else if(event.getSource() == one)
        {
            display.setText(display.getText() + "1");
        }
        else if(event.getSource() == two)
        {
            display.setText(display.getText() + "2");
        }
        else if(event.getSource() == three)
        {
            display.setText(display.getText() + "3");
        }

        //and so on

        else if(event.getSource() == dot)
        {
            display.setText(display.getText() + ".");
            dot.setDisable(true);
        }
        else if(event.getSource() == clear)
        {
            display.setText("");
            dot.setDisable(false);
        } 
        else if(event.getSource() == add)
        {
            data = Float.parseFloat(display.getText());
            operation = 1;
            display.setText("");
            dot.setDisable(false);
        }

        //and so on

        else if(event.getSource() == equals)
        {
            Float secondOperand = Float.parseFloat(display.getText());
            dot.setDisable(false);
            switch(operation)
            {
                case 1: //Addition
                    Double ans = data + secondOperand;
                    display.setText(String.valueOf(ans));
                    data = ans;
                    break;
                case 2: //Subtraction
                    ans = data - secondOperand;
                    display.setText(String.valueOf(ans));
                    data = ans;
                    break;
                case 3: //Multiplication
                    ans = data * secondOperand;
                    display.setText(String.valueOf(ans));
                    data = ans;
                    break;
                case 4: //Division
                    ans = 0d;
                    try{
                    ans = data / secondOperand;
                    }catch(Exception ex){display.setText("Error");}
                    display.setText(String.valueOf(ans));
                    data = ans;
                    break;
            }
            if(event.getSource() != divide && event.getSource() != add && event.getSource() != multi && event.getSource() != minus)
            {
                start = true;
            }
        }
        else if(event.getSource() == backspace)
        {
            // the problem
        }

    }

1 Ответ

1 голос
/ 02 июля 2019

Традиционно Backspace удаляет только последний символ, поэтому все, что вам нужно сделать, это проверить, если display.getText().isEmpty(), а если нет, то продолжайте, вытянув самый правый (последний набранный символ)

else if(event.getSource() == backspace)
{
    if(!display.getText().isEmpty())
        display.setText(display.getText().substring(0,display.getText().length()-1));
}

или

else if(event.getSource() == backspace)
{
    if(!display.getText().isEmpty())
        display.setText(display.getText().replaceAll(".$", ""));
}

или даже

import org.apache.commons.lang.StringUtils;

...

else if(event.getSource() == backspace)
{
    if(!display.getText().isEmpty())
        display.setText(StringUtils.chop(display.getText()));
}

или если вы хотите сохранить свой StringBuilder

else if(event.getSource() == backspace)
{
    if(!display.getText().isEmpty())
        display.setText(new StringBuilder(display.getText()).deleteCharAt(display.getText().length()-1).toString());
}

Если вы забудете добавить чек, вы получите StringIndexOutOfBoundsException

...