必须点击两次才能获取号码,Java 程序未按预期运行

Have to click twice to get number, Java program not working as intended

我有一个关于我在 Java 中编码的计算器的问题,正如您将在代码中看到的那样,我创建了一个 buttonOnScreen() 方法,当单击按钮时它会创建一个新的标签实例,将按钮上的文本添加到它并将其添加到 FlowPane,但我现在的问题是我必须单击任何按钮两次才能在 FlowPane 上获得一个数字。

package calculator;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.*;
import javafx.stage.Stage;



public class Gui extends Application {



//over here all gui initilisation
private Stage Window;

private Scene scene1;

private GridPane operationsgrid;
private BorderPane borderpane;
private FlowPane screen;

private Button add;
private Button subtract;
private Button multiply;
private Button divide;
private Button button1, button2, button3, button4, button5, button6, button7, button8, button9, button0, buttonequals, buttondot;



@Override
public void start(Stage primaryStage) throws Exception {


    Window = primaryStage;
    Window.setTitle("HackCalc");
    //BUTTONS
    button0 = new Button("0");
    button0.setStyle("-fx-font: 30 arial; -fx-base: #b6e7c9;");
    button1 = new Button("1");
    button1.setStyle("-fx-font: 30 arial; -fx-base: #b6e7c9;");
    button2 = new Button("2");
    button2.setStyle("-fx-font: 30 arial; -fx-base: #b6e7c9;");
    button3 = new Button("3");
    button3.setStyle("-fx-font: 30 arial; -fx-base: #b6e7c9;");
    button4 = new Button("4");
    button4.setStyle("-fx-font: 30 arial; -fx-base: #b6e7c9;");
    button5 = new Button("5");
    button5.setStyle("-fx-font: 30 arial; -fx-base: #b6e7c9;");
    button6 = new Button("6");
    button6.setStyle("-fx-font: 30 arial; -fx-base: #b6e7c9;");
    button7 = new Button("7");
    button7.setStyle("-fx-font: 30 arial; -fx-base: #b6e7c9;");
    button8 = new Button("8");
    button8.setStyle("-fx-font: 30 arial; -fx-base: #b6e7c9;");
    button9 = new Button("9");
    button9.setStyle("-fx-font: 30 arial; -fx-base: #b6e7c9;");
    buttonequals = new Button("=");
    buttonequals.setStyle("-fx-font: 30 arial; -fx-base: #b6e7c9;");
    buttondot = new Button(".");
    buttondot.setStyle("-fx-font: 33 arial; -fx-base: #b6e7c9;");
    buttondot.setAlignment(Pos.CENTER);
    add = new Button("+");
    add.setStyle("-fx-font: 30 arial");
    subtract = new Button("-");
    subtract.setStyle("-fx-font: 33 arial");
    multiply = new Button("x");
    multiply.setStyle("-fx-font: 30 arial");
    divide = new Button("÷");
    divide.setStyle("-fx-font: 30 arial");

    //OPERATIONS GRID
    operationsgrid = new GridPane();
    operationsgrid.setPrefSize(300, 300);
    operationsgrid.setAlignment(Pos.CENTER);
    operationsgrid.setVgap(8);
    operationsgrid.setHgap(10);
    operationsgrid.setPadding(new Insets(0, 0, 10, 0));
    GridPane.setConstraints(button1, 0, 0);
    GridPane.setConstraints(button2, 1, 0);
    GridPane.setConstraints(button3, 2, 0);
    GridPane.setConstraints(button4, 0, 1);
    GridPane.setConstraints(button5, 1, 1);
    GridPane.setConstraints(button6, 2, 1);
    GridPane.setConstraints(button7, 0, 2);
    GridPane.setConstraints(button8, 1, 2);
    GridPane.setConstraints(button9, 2, 2);
    GridPane.setConstraints(button0, 0, 3);
    GridPane.setConstraints(buttonequals, 2, 3);
    GridPane.setConstraints(buttondot, 1, 3);
    GridPane.setConstraints(add, 0, 4);
    GridPane.setConstraints(subtract, 1, 4);
    GridPane.setConstraints(multiply, 2, 4);
    GridPane.setConstraints(divide, 1, 5);
    operationsgrid.getChildren().addAll(button0, button1, button2, button3, button4, button5, button6, button7, button8, button9, buttonequals, buttondot, add, subtract, multiply, divide);

    //SCREEN FLOWPANE
    screen = new FlowPane();
    screen.setPadding(new Insets(35, 10, 10, 10));
    screen.setAlignment(Pos.TOP_CENTER);

    borderpane = new BorderPane();
    borderpane.setBottom(operationsgrid);
    borderpane.setTop(screen);


    scene1 = new Scene(borderpane, 400, 500);

    Window.setScene(scene1);

    Window.show();



    //over here all input handling
    add.setOnAction(event -> System.out.println("+"));
    subtract.setOnAction(event -> System.out.println("-"));
    multiply.setOnAction(event -> System.out.println("x"));
    divide.setOnAction(event -> buttonOnScreen(divide));
    button0.setOnAction(event -> buttonOnScreen(button0));

}
private void buttonOnScreen(Button button){
    Button b;
    b = button;
    b.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            Label label = new Label(b.getText());
            screen.getChildren().add(label);
            label.setStyle("-fx-font: 40 arial");

        }
    });

    }

}

在代码中,我使用了 Button0 和 divide 的方法,但我必须单击它们两次才能将它们显示在屏幕上,非常感谢帮助。

此外,如果您对我的代码有任何关于使其更清洁或类似的意见,请这样做:)

您正在将动作事件处理程序添加到动作事件处理程序中。改为这样做:

divide.setOnAction(event -> buttonOnScreen(divide));

private void buttonOnScreen(final Button button) {
    Label label = new Label(button.getText());
    screen.getChildren().add(label);
    label.setStyle("-fx-font: 40 arial");
}

其次,我认为只声明一个 Label,然后附加文本会更整洁 - 不过这只是我的建议。

编辑

为了说明单个 Label 的含义...

private Label screenLabel;
this.screenLabel = new Label();
this.screenLabel.setStyle("-fx-font: 40 arial");


private void buttonOnScreen(final Button button) {
    String text = this.screenText.getText();
    text += button.getText();

    this.screenLabel.setText(text);
}