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