This is my overall code when i first run my application it works fine but when i reset it and tend to click on any of the buttons than the application gets stuck and not responding. After clicking reset i am unable to click any of the button preset on the main window i have to close it forcefully because it gets stuck.i have detected that after reseting the game when i click a button it generates event to go to startgame() function but is starting a loop and generating multiple events in same function
Main.java
package sample;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
primaryStage.setTitle("TIC TAC TOE");
primaryStage.setScene(new Scene(root, 500, 500));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
controller.java
package sample;
import com.jfoenix.controls.JFXButton;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import java.util.concurrent.TimeUnit;
public class Controller {
@FXML
private JFXButton A1;
@FXML
private JFXButton A2;
@FXML
private JFXButton A3;
@FXML
private JFXButton B1;
@FXML
private JFXButton B2;
@FXML
private JFXButton B3;
@FXML
private JFXButton C1;
@FXML
private JFXButton C2;
@FXML
private JFXButton C3;
@FXML
private Label status;
@FXML
private Button exit;
@FXML
private Button reset;
public JFXButton button;
int turn=1;
public void startgame(ActionEvent event)
{
if(turn==1)
{
status.setText("Start the game :)");
}
button = ((JFXButton)event.getSource());
if (((turn%2==0) && (( button.getText().equals(" ")))))
{
status.setText("Its Player 1`s Turn");
button.setText("O");
turn++;
}
else if ((turn%2!=0) && (( button.getText().equals(" "))))
{ status.setText("Its Player 2`s Turn");
button.setText("X");
turn++;
}
else {
status.setText("already filled");
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
if(turn%2==0)
{ status.setText("Player 2's turn");}
else
{ status.setText("Player 1's turn");}
turn--;
startgame(event);
}
if((A1.getText().equals("X")&&A2.getText().equals("X")&&A3.getText().equals("X"))||(B1.getText().equals("X")&&B2.getText().equals("X")&&B3.getText().equals("X"))||(C1.getText().equals("X")&&C2.getText().equals("X")&&C3.getText().equals("X"))||(A1.getText().equals("X")&&B2.getText().equals("X")&&C3.getText().equals("X"))|| (A3.getText().equals("X")&&B2.getText().equals("X")&&C1.getText().equals("X"))||(A2.getText().equals("X")&&B2.getText().equals("X")&&C2.getText().equals("X"))||(A1.getText().equals("X")&&B1.getText().equals("X")&&C1.getText().equals("X"))||(A2.getText().equals("X")&&B2.getText().equals("X")&&C2.getText().equals("X"))||(A3.getText().equals("X")&&B3.getText().equals("X")&&C3.getText().equals("X")))
{
status.setText("game ended \n p1 Won ");
lock();
}
if((A1.getText().equals("O")&&A2.getText().equals("O")&&A3.getText().equals("O"))||(B1.getText().equals("O")&&B2.getText().equals("O")&&B3.getText().equals("O"))||(C1.getText().equals("O")&&C2.getText().equals("O")&&C3.getText().equals("O"))||(A1.getText().equals("O")&&B2.getText().equals("O")&&C3.getText().equals("O"))|| (A3.getText().equals("O")&&B2.getText().equals("O")&&C1.getText().equals("O"))||(A2.getText().equals("O")&&B2.getText().equals("O")&&C2.getText().equals("O"))||(A1.getText().equals("O")&&B1.getText().equals("O")&&C1.getText().equals("O"))||(A2.getText().equals("O")&&B2.getText().equals("O")&&C2.getText().equals("O"))||(A3.getText().equals("O")&&B3.getText().equals("O")&&C3.getText().equals("O")))
{
status.setText("game ended \n p2 Won");
lock();
}
else if (turn>9)
{
status.setText("game Drawn");
lock();
}
}
private void lock()
{
A1.setDisable(true);
A2.setDisable(true);
A3.setDisable(true);
B1.setDisable(true);
B2.setDisable(true);
B3.setDisable(true);
C1.setDisable(true);
C2.setDisable(true);
C3.setDisable(true);
}
@FXML
void exitGame(ActionEvent event) {
System.exit(0);
}
@FXML
void resetGame(ActionEvent event)
{
A1.setDisable(false);
A2.setDisable(false);
A3.setDisable(false);
B1.setDisable(false);
B2.setDisable(false);
B3.setDisable(false);
C1.setDisable(false);
C2.setDisable(false);
C3.setDisable(false);
A1.setText("");
A2.setText("");
A3.setText("");
B1.setText("");
B2.setText("");
B3.setText("");
C1.setText("");
C2.setText("");
C3.setText("");
status.setText("game restarted");
turn=1;
}
}
sample.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import com.jfoenix.controls.JFXButton?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Separator?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="500.0" prefWidth="500.0" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
<children>
<HBox layoutY="27.0" prefHeight="110.0" prefWidth="500.0">
<children>
<JFXButton fx:id="A1" onAction="#startgame" prefHeight="113.0" prefWidth="165.0" text=" " />
<Separator orientation="VERTICAL" prefHeight="128.0" prefWidth="6.0" style="-fx-background-color: BLACK;" />
<JFXButton fx:id="A2" onAction="#startgame" prefHeight="117.0" prefWidth="162.0" text=" " />
<Separator orientation="VERTICAL" prefHeight="200.0" style="-fx-background-color: BLACK;" />
<JFXButton fx:id="A3" onAction="#startgame" prefHeight="112.0" prefWidth="163.0" text=" " />
</children>
</HBox>
<Label fx:id="status" alignment="BOTTOM_LEFT" layoutX="113.0" layoutY="372.0" prefHeight="49.0" prefWidth="253.0" textAlignment="JUSTIFY" />
<Separator layoutX="-1.0" layoutY="137.0" prefHeight="3.0" prefWidth="500.0" style="-fx-background-color: BLACK;" />
<HBox layoutX="-1.0" layoutY="140.0" prefHeight="116.0" prefWidth="500.0">
<children>
<JFXButton fx:id="B1" onAction="#startgame" prefHeight="107.0" prefWidth="166.0" text=" " />
<Separator orientation="VERTICAL" prefHeight="119.0" prefWidth="6.0" style="-fx-background-color: BLACK;" />
<JFXButton fx:id="B2" onAction="#startgame" prefHeight="109.0" prefWidth="163.0" text=" " />
<Separator orientation="VERTICAL" prefHeight="126.0" prefWidth="6.0" style="-fx-background-color: BLACK;" />
<JFXButton fx:id="B3" onAction="#startgame" prefHeight="107.0" prefWidth="163.0" text=" " />
</children>
</HBox>
<Separator layoutX="4.0" layoutY="249.0" prefHeight="3.0" prefWidth="500.0" style="-fx-background-color: BLACK;" />
<HBox layoutX="-1.0" layoutY="249.0" prefHeight="116.0" prefWidth="500.0">
<children>
<JFXButton fx:id="C1" onAction="#startgame" prefHeight="118.0" prefWidth="165.0" text=" " />
<Separator orientation="VERTICAL" prefHeight="200.0" style="-fx-background-color: BLACK;" />
<JFXButton fx:id="C2" onAction="#startgame" prefHeight="117.0" prefWidth="162.0" text=" " />
<Separator orientation="VERTICAL" prefHeight="200.0" style="-fx-background-color: BLACK;" />
<JFXButton fx:id="C3" onAction="#startgame" prefHeight="117.0" prefWidth="162.0" text=" " />
</children>
</HBox>
<Button fx:id="exit" layoutX="415.0" layoutY="447.0" mnemonicParsing="false" onAction="#exitGame" text="Exit" />
<Button fx:id="reset" layoutX="24.0" layoutY="447.0" mnemonicParsing="false" onAction="#resetGame" text="RESET" />
</children>
</AnchorPane>
in you test validation you test if your button is equal to one space : x.equal(" ")
(startGame)
but when you reset the game you set you ButtonText to empty : A1.setText("");
(resetGame)
"" != " "
so you need to add a space in each button of you reset or verify that it is empty.
moreover you call startGame in the else of startGame so because your condition is false you fall in an infinite loop