java - 在 JavaFX 中为计算器创建退格按钮

标签 java javafx calculator backspace

我正在尝试创建一个 JavaFX 计算器,这是一个非常基本的计算器,但我不确定如何实现退格键。

private void makeBackspaceButton(Button button) {
    button.setStyle("-fx-base: ivory;");
    button.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent actionEvent) {
            value.set(value.get());
        }
    });

}

我无法想出一种方法来删除最后输入的值。因此,如果输入值 89,则仅删除最后一位数字 (9)。 有没有办法以这种格式使用它,或者我需要更改我的格式。 我的完整代码如下,尚未完成。

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.property.*;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.*;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

import java.util.HashMap;
import java.util.Map;

// a simple JavaFX calculator.
public class Calcy extends Application {

//implementing the template if how i would like the buttons to look like
private static final String[][] template = {
    {"c", "%", "√", "←"},
    {"7", "8", "9", "/"},
    {"4", "5", "6", "*"},
    {"1", "2", "3", "-"},
    {"0", ".", "=", "+"}
};

private final Map<String, Button> accelerators = new HashMap<>();


private DoubleProperty stackValue = new SimpleDoubleProperty();
private DoubleProperty value = new SimpleDoubleProperty();

private enum Op {

    NOOP, ADD, SUBTRACT, MULTIPLY, DIVIDE
}

private Op curOp = Op.NOOP;
private Op stackOp = Op.NOOP;

public static void main(String[] args) {
    launch(args);
}

@Override
public void start(Stage stage) {
    final TextField screen = createScreen();
    final TilePane buttons = createButtons();

    stage.setTitle("Thank goodness for a calculator!");
    stage.initStyle(StageStyle.UTILITY);
    stage.setResizable(false);
    stage.setScene(new Scene(createLayout(screen, buttons)));
    stage.show();
}

private VBox createLayout(TextField screen, TilePane buttons) {
    final VBox layout = new VBox(20);
    layout.setAlignment(Pos.CENTER);
    layout.setStyle("-fx-background-color: floralwhite; -fx-padding: 20; -fx-font-size: 20;");
    layout.getChildren().setAll(screen, buttons);
    handleAccelerators(layout);
    screen.prefWidthProperty().bind(buttons.widthProperty());
    return layout;
}

private void handleAccelerators(VBox layout) {
    layout.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent keyEvent) {
            Button activated = accelerators.get(keyEvent.getText());
            if (activated != null) {
                activated.fire();
            }
        }
    });
}

private TextField createScreen() {
    final TextField screen = new TextField();
    screen.setStyle("-fx-background-color: lightgrey;");
    screen.setAlignment(Pos.CENTER_RIGHT);
    screen.setEditable(false);
    screen.textProperty().bind(Bindings.format("%.2f", value));
    return screen;
}

private TilePane createButtons() {
    TilePane buttons = new TilePane();
    buttons.setVgap(7);
    buttons.setHgap(7);
    buttons.setPrefColumns(template[0].length);
    for (String[] r : template) {
        for (String s : r) {
            buttons.getChildren().add(createButton(s));
        }
    }
    return buttons;
}

private Button createButton(final String s) {
    Button button = makeStandardButton(s);

    if (s.matches("[0-9]")) {
        makeNumericButton(s, button);
    } else {
        final ObjectProperty<Op> triggerOp = determineOperand(s);
        if (triggerOp.get() != Op.NOOP) {
            makeOperandButton(button, triggerOp);
        } else if ("c".equals(s)) {
            makeClearButton(button);
        } else if ("=".equals(s)) {
            makeEqualsButton(button);
        } else if ("←".equals(s)) {
            makeBackspaceButton(button);
        } else if ("%".equals(s)) {
            makePercentageButton(button);
        } else if ("√".equals(s)) {
            makeSquarerootButton(button);
        } else if (".".equals(s)) {
            makePointButton(button);
        }
    }

    return button;
}

private ObjectProperty<Op> determineOperand(String s) {
    final ObjectProperty<Op> triggerOp = new SimpleObjectProperty<>(Op.NOOP);
    switch (s) {
        case "+":
            triggerOp.set(Op.ADD);
            break;
        case "-":
            triggerOp.set(Op.SUBTRACT);
            break;
        case "*":
            triggerOp.set(Op.MULTIPLY);
            break;
        case "/":
            triggerOp.set(Op.DIVIDE);
            break;
        case "%":

    }
    return triggerOp;
}

private void makeOperandButton(Button button, final ObjectProperty<Op> triggerOp) {
    button.setStyle("-fx-base: ivory;");
    button.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent actionEvent) {
            curOp = triggerOp.get();
        }
    });
}

private Button makeStandardButton(String s) {
    Button button = new Button(s);
    button.setStyle("-fx-base: ivory;");
    accelerators.put(s, button);
    button.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
    return button;
}

private void makeNumericButton(final String s, Button button) {
    button.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent actionEvent) {
            if (curOp == Op.NOOP) {
                value.set(value.get() * 10 + Integer.parseInt(s));
            } else {
                stackValue.set(value.get());
                value.set(Integer.parseInt(s));
                stackOp = curOp;
                curOp = Op.NOOP;
            }
        }
    });
}

private void makeClearButton(Button button) {
    button.setStyle("-fx-base: ivory;");
    button.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent actionEvent) {
            value.set(0);
        }
    });
}

private void makeBackspaceButton(Button button) {
    button.setStyle("-fx-base: ivory;");
    button.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent actionEvent) {
            value.set(value.get());
        }
    });

}

private void makeSquarerootButton(Button button) {
    button.setStyle("-fx-base: ivory;");
}

private void makePercentageButton(Button button) {
    button.setStyle("-fx-base: ivory;");
}

private void makePointButton(Button button) {
    button.setStyle("-fx-base: ivory;");
}

private void makeEqualsButton(Button button) {
    button.setStyle("-fx-base: ivory;");
    button.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent actionEvent) {
            switch (stackOp) {
                case ADD:
                    value.set(stackValue.get() + value.get());
                    break;
                case SUBTRACT:
                    value.set(stackValue.get() - value.get());
                    break;
                case MULTIPLY:
                    value.set(stackValue.get() * value.get());
                    break;
                case DIVIDE:
                    value.set(stackValue.get() / value.get());
                    break;
            }
        }
    });
}

}

最佳答案

您只需在退格按钮的操作方法中添加以下行即可。这只是我所做的正常操作。

正在获取号码,但可以通过以下方式访问最后输入的号码

(int)value.get()/10

稍后可以通过以下方式访问小数部分

value.get() - (int)value.get())

所以这就是事情

button.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent actionEvent) {
        value.set((int)value.get()/10 + 
        /**
        * To get the decimal part
        */
        value.get() - (int)value.get());
    }
});

小数部分在您的计算器上仍然不起作用,也请修复它。完成后,您将必须更改方法以考虑小数点之前和之后的值!

关于java - 在 JavaFX 中为计算器创建退格按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22784681/

相关文章:

user-interface - 如何在 JavaFX 场景中定位按钮(或任何 GUI 元素)?

c++ - 用非常大的数字进行计算

python - 我的Python计算器程序允许输入字符

java - 本地资源的 URI

java - 分离调试/开发代码 java/javafx 的最佳实践

java - HQL NamedQuery 在 HashMap 上具有内连接

java - 如何在 EventHandler 中使用 FXMLLoader?

计算给定年份和年份的日期

java - -XX :G1ReservePercent and to-space exhausted

java - 错误无法解决或不是字段是什么意思?