All code .

After starting the program, the first button press is not tracked. If you use commented lines and change the fxml file, everything works correctly.

Tell me, please, what could be the difficulty?

Is it possible to create only one instance of the class MyEvent() for all buttons, and not the way I have in the code for the btnClick(ActionEvent event) method btnClick(ActionEvent event) ?

 public class MyController implements Initializable { @Override public void initialize(URL location, ResourceBundle resources) { } private double oper1 = 0, oper2 = 0; private String operation = ""; @FXML private Button btn0, btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9; @FXML private Button btnClear, btnPoint, btnResult, btnDivide, btnSum, btnSub, btnMultiply; @FXML private TextField txtField; @FXML private AnchorPane lblDisplay; public void btnClick(ActionEvent event) { btn0.setOnAction(new MyEvent()); btn1.setOnAction(new MyEvent()); btn2.setOnAction(new MyEvent()); btn3.setOnAction(new MyEvent()); btn4.setOnAction(new MyEvent()); btn5.setOnAction(new MyEvent()); btn6.setOnAction(new MyEvent()); btn7.setOnAction(new MyEvent()); btn8.setOnAction(new MyEvent()); btn9.setOnAction(new MyEvent()); } /* * public void addNum0(ActionEvent event) { * if(btn0 == event.getSource()){ * if(txtField.getText().equals("0")){ * txtField.setText(txtField.getText() + * ""); }else{ txtField.setText(txtField.getText() + "0"); * System.out.println("0"); } } } * * public void addNum1(ActionEvent event) { * if(txtField.getText().equals("0")){ txtField.setText(""); } * txtField.setText(txtField.getText() + "1"); System.out.println("1"); } * * public void addNum2(ActionEvent event) { * if(txtField.getText().equals("0")){ txtField.setText(""); } * txtField.setText(txtField.getText() + "2"); System.out.println("2"); } * * public void addNum3(ActionEvent event) { * if(txtField.getText().equals("0")){ txtField.setText(""); } * txtField.setText(txtField.getText() + "3"); System.out.println("3"); } * * public void addNum4(ActionEvent event) { * if(txtField.getText().equals("0")){ txtField.setText(""); } * txtField.setText(txtField.getText() + "4"); System.out.println("4"); } * * public void addNum5(ActionEvent event) { * if(txtField.getText().equals("0")){ txtField.setText(""); } * txtField.setText(txtField.getText() + "5"); System.out.println("5"); } * * public void addNum6(ActionEvent event) { * if(txtField.getText().equals("0")){ txtField.setText(""); } * txtField.setText(txtField.getText() + "6"); System.out.println("6"); } * * public void addNum7(ActionEvent event) { * if(txtField.getText().equals("0")){ txtField.setText(""); } * txtField.setText(txtField.getText() + "7"); System.out.println("7"); } * * public void addNum8(ActionEvent event) { * if(txtField.getText().equals("0")){ txtField.setText(""); } * txtField.setText(txtField.getText() + "8"); System.out.println("8"); } * * public void addNum9(ActionEvent event) { * if(txtField.getText().equals("0")){ txtField.setText(""); } * txtField.setText(txtField.getText() + "9"); System.out.println("9"); } */ public void clearDisplay(ActionEvent event) { System.out.println("Clear"); txtField.setText("0"); } public void addDivide(ActionEvent event) { System.out.println("Divide"); oper1 = Double.valueOf(txtField.getText()); txtField.setText(""); operation = "/"; } public void addMultiply(ActionEvent event) { System.out.println("Multiply"); oper1 = Double.valueOf(txtField.getText()); txtField.setText(""); operation = "*"; } public void addSubtract(ActionEvent event) { System.out.println("Subtract"); oper1 = Double.valueOf(txtField.getText()); txtField.setText(""); operation = "-"; } public void addSum(ActionEvent event) { System.out.println("Sum"); oper1 = Double.valueOf(txtField.getText()); txtField.setText(""); operation = "+"; } public void addPoint(ActionEvent event) { if (btnPoint == event.getSource()) { if (!txtField.getText().contains(".")) { txtField.setText(txtField.getText() + "."); System.out.println("Point"); } } } public void result(ActionEvent event) { MathCalculator math = new MathCalculator(); oper2 = Double.valueOf(txtField.getText()); txtField.setText(""); if (operation.equals("/")) { math.divide(oper1, oper2); } else if (operation.equals("*")) { math.multiply(oper1, oper2); } else if (operation.equals("-")) { math.subtract(oper1, oper2); } else { math.sum(oper1, oper2); } txtField.setText(String.valueOf(oper1) + " " + operation + " " + String.valueOf(oper2) + " = " + String.valueOf(math.getResult())); } class MyEvent implements EventHandler<ActionEvent> { @Override public void handle(ActionEvent event) { Button btn = (Button) event.getSource(); if (txtField.getText().equals("0")) { txtField.setText(""); } txtField.setText(txtField.getText() + btn.getText()); switch (btn.getText()) { case "0": System.out.println("0"); break; case "1": System.out.println("1"); break; case "2": System.out.println("2"); break; case "3": System.out.println("3"); break; case "4": System.out.println("4"); break; case "5": System.out.println("5"); break; case "6": System.out.println("6"); break; case "7": System.out.println("7"); break; case "8": System.out.println("8"); break; case "9": System.out.println("9"); break; } } } <?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.*?> <?import java.lang.*?> <?import javafx.scene.layout.*?> <?import javafx.scene.layout.AnchorPane?> <AnchorPane fx:id="lblDisplay" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="290.0" prefWidth="257.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controller.MyController"> <children> <GridPane layoutX="27.0" layoutY="79.0" prefHeight="200.0" prefWidth="240.0"> <columnConstraints> <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" /> <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" /> <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" /> <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" /> </columnConstraints> <rowConstraints> <RowConstraints minHeight="10.0" vgrow="SOMETIMES" /> <RowConstraints minHeight="10.0" vgrow="SOMETIMES" /> <RowConstraints minHeight="10.0" vgrow="SOMETIMES" /> <RowConstraints minHeight="10.0" vgrow="SOMETIMES" /> </rowConstraints> <children> <Button fx:id="btn8" layoutX="102.0" layoutY="108.0" mnemonicParsing="false" onAction="#btnClick" text="8" GridPane.columnIndex="1" /> <Button fx:id="btn9" layoutX="172.0" layoutY="108.0" mnemonicParsing="false" onAction="#btnClick" prefHeight="25.0" prefWidth="25.0" text="9" GridPane.columnIndex="2" /> <Button fx:id="btn7" layoutX="31.0" layoutY="108.0" mnemonicParsing="false" onAction="#btnClick" prefHeight="25.0" prefWidth="25.0" text="7" /> <Button fx:id="btn2" layoutX="102.0" layoutY="185.0" mnemonicParsing="false" onAction="#btnClick" text="2" GridPane.columnIndex="1" GridPane.rowIndex="2" /> <Button fx:id="btn1" layoutX="31.0" layoutY="185.0" mnemonicParsing="false" onAction="#btnClick" prefHeight="25.0" prefWidth="25.0" text="1" GridPane.rowIndex="2" /> <Button fx:id="btn4" layoutX="31.0" layoutY="144.0" mnemonicParsing="false" onAction="#btnClick" prefHeight="25.0" prefWidth="25.0" text="4" GridPane.rowIndex="1" /> <Button fx:id="btn0" layoutX="102.0" layoutY="228.0" mnemonicParsing="false" onAction="#btnClick" prefHeight="25.0" prefWidth="25.0" text="0" GridPane.columnIndex="1" GridPane.rowIndex="3" /> <Button fx:id="btnResult" layoutX="172.0" layoutY="228.0" mnemonicParsing="false" onAction="#result" prefHeight="25.0" prefWidth="25.0" text="=" GridPane.columnIndex="2" GridPane.rowIndex="3" /> <Button fx:id="btn3" layoutX="172.0" layoutY="185.0" mnemonicParsing="false" onAction="#btnClick" prefHeight="25.0" prefWidth="25.0" text="3" GridPane.columnIndex="2" GridPane.rowIndex="2" /> <Button fx:id="btn5" layoutX="102.0" layoutY="144.0" mnemonicParsing="false" onAction="#btnClick" text="5" GridPane.columnIndex="1" GridPane.rowIndex="1" /> <Button fx:id="btnSum" layoutX="240.0" layoutY="228.0" mnemonicParsing="false" onAction="#addSum" prefHeight="25.0" prefWidth="25.0" text="+" GridPane.columnIndex="3" GridPane.rowIndex="3" /> <Button fx:id="btnPoint" layoutX="31.0" layoutY="228.0" mnemonicParsing="false" onAction="#addPoint" prefHeight="25.0" prefWidth="25.0" text="." GridPane.rowIndex="3" /> <Button fx:id="btnDivide" layoutX="240.0" layoutY="108.0" mnemonicParsing="false" onAction="#addDivide" prefHeight="25.0" prefWidth="25.0" text="/" GridPane.columnIndex="3" /> <Button fx:id="btn6" layoutX="172.0" layoutY="144.0" mnemonicParsing="false" onAction="#btnClick" prefHeight="25.0" prefWidth="25.0" text="6" GridPane.columnIndex="2" GridPane.rowIndex="1" /> <Button fx:id="btnMultiply" layoutX="240.0" layoutY="144.0" mnemonicParsing="false" onAction="#addMultiply" prefHeight="25.0" prefWidth="25.0" text="*" GridPane.columnIndex="3" GridPane.rowIndex="1" /> <Button fx:id="btnSub" layoutX="240.0" layoutY="185.0" mnemonicParsing="false" onAction="#addSubtract" prefHeight="25.0" prefWidth="25.0" text="-" GridPane.columnIndex="3" GridPane.rowIndex="2" /> </children> </GridPane> <Button fx:id="btnClear" layoutX="9.0" layoutY="54.0" mnemonicParsing="false" onAction="#clearDisplay" prefHeight="25.0" prefWidth="240.0" text="Clear" /> <TextField fx:id="txtField" alignment="TOP_RIGHT" editable="false" layoutX="9.0" layoutY="14.0" prefHeight="25.0" prefWidth="240.0" text="0" /> </children> </AnchorPane> 

1 answer 1

The difficulty is that your handler hangs on the buttons only after you clicked on the button. Therefore, it does not work for you immediately, but only after the second press.

In this case, if you want to hang your MyEvent handler, you do not need to fxml handler on onClick in onClick . To make one copy, create it once and immediately hang it on buttons, for example, in the initialize() method

In your case, the correct fxml will look like this:

 <children> <Button fx:id="btn8" layoutX="102.0" layoutY="108.0" mnemonicParsing="false" text="8" GridPane.columnIndex="1" /> <Button fx:id="btn9" layoutX="172.0" layoutY="108.0" mnemonicParsing="false" prefHeight="25.0" prefWidth="25.0" text="9" GridPane.columnIndex="2" /> <Button fx:id="btn7" layoutX="31.0" layoutY="108.0" mnemonicParsing="false" prefHeight="25.0" prefWidth="25.0" text="7" /> <Button fx:id="btn2" layoutX="102.0" layoutY="185.0" mnemonicParsing="false" text="2" GridPane.columnIndex="1" GridPane.rowIndex="2" /> <Button fx:id="btn1" layoutX="31.0" layoutY="185.0" mnemonicParsing="false" prefHeight="25.0" prefWidth="25.0" text="1" GridPane.rowIndex="2" /> <Button fx:id="btn4" layoutX="31.0" layoutY="144.0" mnemonicParsing="false" prefHeight="25.0" prefWidth="25.0" text="4" GridPane.rowIndex="1" /> <Button fx:id="btn0" layoutX="102.0" layoutY="228.0" mnemonicParsing="false" prefHeight="25.0" prefWidth="25.0" text="0" GridPane.columnIndex="1" GridPane.rowIndex="3" /> <Button fx:id="btnResult" layoutX="172.0" layoutY="228.0" mnemonicParsing="false" onAction="#result" prefHeight="25.0" prefWidth="25.0" text="=" GridPane.columnIndex="2" GridPane.rowIndex="3" /> <Button fx:id="btn3" layoutX="172.0" layoutY="185.0" mnemonicParsing="false" prefHeight="25.0" prefWidth="25.0" text="3" GridPane.columnIndex="2" GridPane.rowIndex="2" /> <Button fx:id="btn5" layoutX="102.0" layoutY="144.0" mnemonicParsing="false" text="5" GridPane.columnIndex="1" GridPane.rowIndex="1" /> <Button fx:id="btnSum" layoutX="240.0" layoutY="228.0" mnemonicParsing="false" onAction="#addSum" prefHeight="25.0" prefWidth="25.0" text="+" GridPane.columnIndex="3" GridPane.rowIndex="3" /> <Button fx:id="btnPoint" layoutX="31.0" layoutY="228.0" mnemonicParsing="false" onAction="#addPoint" prefHeight="25.0" prefWidth="25.0" text="." GridPane.rowIndex="3" /> <Button fx:id="btnDivide" layoutX="240.0" layoutY="108.0" mnemonicParsing="false" onAction="#addDivide" prefHeight="25.0" prefWidth="25.0" text="/" GridPane.columnIndex="3" /> <Button fx:id="btn6" layoutX="172.0" layoutY="144.0" mnemonicParsing="false" prefHeight="25.0" prefWidth="25.0" text="6" GridPane.columnIndex="2" GridPane.rowIndex="1" /> <Button fx:id="btnMultiply" layoutX="240.0" layoutY="144.0" mnemonicParsing="false" onAction="#addMultiply" prefHeight="25.0" prefWidth="25.0" text="*" GridPane.columnIndex="3" GridPane.rowIndex="1" /> <Button fx:id="btnSub" layoutX="240.0" layoutY="185.0" mnemonicParsing="false" onAction="#addSubtract" prefHeight="25.0" prefWidth="25.0" text="-" GridPane.columnIndex="3" GridPane.rowIndex="2" /> </children> 

Here we removed the licensed onClick for all the numeric buttons.

Now, let's move on to creating an event and installing it on all buttons.

 public class MyController implements Initializable { @Override public void initialize(URL location, ResourceBundle resources) { MyEvent btnEvent = new MyEvent(); btn0.setOnAction(btnEvent); btn1.setOnAction(btnEvent); btn2.setOnAction(btnEvent); btn3.setOnAction(btnEvent); btn4.setOnAction(btnEvent); btn5.setOnAction(btnEvent); btn6.setOnAction(btnEvent); btn7.setOnAction(btnEvent); btn8.setOnAction(btnEvent); btn9.setOnAction(btnEvent); } 

PS

 switch (btn.getText()) { case "0": System.out.println("0"); break; case "1": System.out.println("1"); break; case "2": System.out.println("2"); break; case "3": System.out.println("3"); break; case "4": System.out.println("4"); break; сase "5": System.out.println("5"); break; case "6": System.out.println("6"); break; case "7": System.out.println("7"); break; сase "8": System.out.println("8"); break; case "9": System.out.println("9"); break; } } 

change to

 System.out.println(btn.getText()); 
  • Thank you, Andrew. - Hokins