必须单击两次才能获得数字,Java程序无法按预期工作

必须单击两次才能获得数字,Java程序无法按预期工作,java,user-interface,javafx,calculator,Java,User Interface,Javafx,Calculator,我有一个关于我用Java编写的计算器的问题,正如您在代码中看到的,我创建了一个方法,它是buttonOnScreen(),当单击一个按钮时,它会创建一个新的标签实例,将按钮上的文本添加到其中,并将其添加到流窗格中,但我现在的问题是,我必须点击任意按钮两次,才能在流程窗格中获得一个数字 package calculator; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.

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

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");

        }
    });

    }

}
package计算器;
导入javafx.application.application;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.geometry.Insets;
导入javafx.geometry.Pos;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.control.Label;
导入javafx.scene.layout.*;
导入javafx.stage.stage;
公共类Gui扩展应用程序{
//这里是所有gui初始化
私人舞台窗口;
私密场景1;
私有网格窗格操作网格;
私有边框窗格边框窗格;
专用流程窗格屏幕;
私人按钮添加;
专用按钮减法;
私有按钮乘法;
私有按钮划分;
私人按钮按钮1、按钮2、按钮3、按钮4、按钮5、按钮6、按钮7、按钮8、按钮9、按钮0、按钮相等、按钮不相等;
@凌驾
public void start(Stage primaryStage)引发异常{
窗口=初级阶段;
Window.setTitle(“HackCalc”);
//钮扣
按钮0=新按钮(“0”);
button0.setStyle(“-fx字体:30 arial;-fx基:#b6e7c9;”);
按钮1=新按钮(“1”);
button1.setStyle(“-fx字体:30 arial;-fx基础:#b6e7c9;”);
按钮2=新按钮(“2”);
按钮2.setStyle(“-fx字体:30 arial;-fx基础:#b6e7c9;”);
按钮3=新按钮(“3”);
按钮3.setStyle(“-fx字体:30 arial;-fx基:#b6e7c9;”);
按钮4=新按钮(“4”);
按钮4.setStyle(“-FXFont:30 arial;-FXBase:#b6e7c9;”);
按钮5=新按钮(“5”);
按钮5.setStyle(“-FXFont:30 arial;-FXBase:#b6e7c9;”);
按钮6=新按钮(“6”);
按钮6.setStyle(“-fx字体:30 arial;-fx基:#b6e7c9;”);
按钮7=新按钮(“7”);
按钮7.setStyle(“-fx字体:30 arial;-fx基:#b6e7c9;”);
按钮8=新按钮(“8”);
按钮8.setStyle(“-fx字体:30 arial;-fx基:#b6e7c9;”);
按钮9=新按钮(“9”);
按钮9.setStyle(“-fx字体:30 arial;-fx基:#b6e7c9;”);
buttonequals=新按钮(“=”);
buttonequals.setStyle(“-fx字体:30 arial;-fx基:#b6e7c9;”);
buttondot=新按钮(“.”);
buttondot.setStyle(“-fx字体:33 arial;-fx基:#b6e7c9;”);
按钮设置对齐(位置中心);
添加=新按钮(“+”);
添加.setStyle(“-fx字体:30 arial”);
减法=新按钮(“-”);
减去.setStyle(“-fx字体:33 arial”);
乘法=新按钮(“x”);
multiply.setStyle(“-fx字体:30 arial”);
除法=新按钮(“÷”);
divide.setStyle(“-fx字体:30 arial”);
//操作网格
operationsgrid=新建GridPane();
operationsgrid.setPrefSize(300300);
操作网格设置对齐(位置中心);
操作网格。设置间隙(8);
操作网格。setHgap(10);
设置填充(新的插入(0,0,10,0));
设置约束(按钮1,0,0);
设置约束(按钮2,1,0);
设置约束(按钮3、2、0);
设置约束(按钮4、0、1);
设置约束(按钮5、1、1);
设置约束(按钮6、2、1);
设置约束(按钮7、0、2);
设置约束(按钮8、1、2);
设置约束(按钮9、2、2);
设置约束(按钮0,0,3);
设置约束(按钮相等,2,3);
setConstraints(buttondot,1,3);
setConstraints(add,0,4);
设置约束(减法,1,4);
设置约束(乘法,2,4);
设置约束(除法,1,5);
operationsgrid.getChildren().addAll(按钮0、按钮1、按钮2、按钮3、按钮4、按钮5、按钮6、按钮7、按钮8、按钮9、按钮相等、按钮不相等、加、减、乘、除);
//屏幕流程窗格
屏幕=新的流程窗格();
屏幕设置填充(新插图(35,10,10,10));
屏幕设置对齐(位置顶部\中心);
borderpane=新的borderpane();
borderpane.setBottom(操作网格);
边框窗格。设置顶部(屏幕);
场景1=新场景(边框窗格,400500);
窗口设置场景(场景1);
Window.show();
//这里是所有的输入处理
add.setOnAction(事件->系统.out.println(“+”);
减去.setOnAction(事件->系统输出.println(“-”);
multiply.setOnAction(事件->系统输出.println(“x”);
divide.setOnAction(事件->按钮非屏幕(divide));
按钮0.设置操作(事件->按钮非屏幕(按钮0));
}
专用无效按钮非屏幕(按钮){
按钮b;
b=按钮;
b、 setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
Label Label=新标签(b.getText());
screen.getChildren().add(标签);
label.setStyle(“-fx字体: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");
}
其次,我认为只声明一个
标签
,然后在其中添加文本会更整洁,不过这只是我的建议

编辑 要说明单个
标签
的含义

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);
}
嘿,谢谢,真是太棒了:),如果不是太多的话,请你写代码向我解释一下你所说的单个标签是什么意思?我还是编程术语的初学者。