必须点击两次才能获取号码,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);
}
我有一个关于我在 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);
}