Search code examples
javajavafxcalculatorbackspace

Backspace Button In JavaFX


I am making a calculator project using JavaFX. In my calculator, I had a backspace button. I tried the old way, something like this:

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

But that didn't work, possibly and probably because of the versions. So, I was wondering if there was any way I could implement or create the backspace button in JavaFX.

This is my FXML Controller:

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

    }

Solution

  • Traditionally backspace only removes the last character so all you would need to do is check if display.getText().isEmpty() and if its not then continue by pulling off the rightmost(Last typed Character)

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

    or

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

    or even

    import org.apache.commons.lang.StringUtils;
    
    ...
    
    else if(event.getSource() == backspace)
    {
        if(!display.getText().isEmpty())
            display.setText(StringUtils.chop(display.getText()));
    }
    

    or if you want to keep your StringBuilder

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

    If you forget to add the check you will get an StringIndexOutOfBoundsException