JavaFX Выйти из менюItem - PullRequest
       1

JavaFX Выйти из менюItem

0 голосов
/ 22 сентября 2018

Как закрыть программу, нажав «Выйти» в меню?Я работаю со Scene Builder и с FXML, поэтому я попытался создать метод closeOPT () в основном классе, который содержит код для закрытия моего приложения, но когда я делаю экземпляр в контроллере, он не работает.Так что теперь я понятия не имею, как заставить это работать.Я также попытался соединить метод close с идентификатором FXML в основном классе, но это также не сработало.

enter code here




public class GameController {

@FXML Button b1;
@FXML Button b2;
@FXML Button b3;
@FXML Button b4;
@FXML Button b5;
@FXML Button b6;
@FXML Button b7;
@FXML Button b8;
@FXML Button b9;
@FXML GridPane gameBoard;



private boolean isFirstPlayer = true;

public void buttonClickHandler(ActionEvent evt) {

    Button clickedButton = (Button) evt.getTarget();

    String buttonLabel = clickedButton.getText();

    if("".equals(buttonLabel) && isFirstPlayer) {
        clickedButton.setText("X");
        isFirstPlayer = false;
    }
    else if("".equals(buttonLabel)&& !isFirstPlayer) {
        clickedButton.setText("O");
        isFirstPlayer = true;
    }


    find3InARow();
}

private boolean find3InARow(){
       //Row 1
       if (""!=b1.getText() && b1.getText() == b2.getText() 
           && b2.getText() == b3.getText()){
           highlightWinningCombo(b1,b2,b3);
           return true;
       }
       //Row 2
       if (""!=b4.getText() && b4.getText() == b5.getText() 
           && b5.getText() == b6.getText()){
           highlightWinningCombo(b4,b5,b6);
           return true;
       }
       //Row 3
       if (""!=b7.getText() && b7.getText() == b8.getText() 
           && b8.getText() == b9.getText()){
           highlightWinningCombo(b7,b8,b9);
           return true;
       }
       //Column 1
       if (""!=b1.getText() && b1.getText() == b4.getText() 
           && b4.getText() == b7.getText()){
           highlightWinningCombo(b1,b4,b7);
           return true;
       }
       //Column 2
       if (""!=b2.getText() && b2.getText() == b5.getText() 
           && b5.getText() == b8.getText()){
           highlightWinningCombo(b2,b5,b8);
           return true;
       }
       //Column 3
       if (""!=b3.getText() && b3.getText() == b6.getText() 
           && b6.getText() == b9.getText()){
           highlightWinningCombo(b3,b6,b9);
           return true;
       }
       //Diagonal 1
       if (""!=b1.getText() && b1.getText() == b5.getText() 
           && b5.getText() == b9.getText()){
           highlightWinningCombo(b1,b5,b9);
           return true;
       }
       //Diagonal 2
       if (""!=b3.getText() && b3.getText() == b5.getText() 
           && b5.getText() == b7.getText()){
           highlightWinningCombo(b3,b5,b7);
           return true;
       }       
       return false;
   }

private void highlightWinningCombo(Button first, Button second, Button third){
       first.getStyleClass().add("winning-button");
       second.getStyleClass().add("winning-button");
       third.getStyleClass().add("winning-button");

   }

   public void menuClickHandler(ActionEvent evt){
        MenuItem clickedMenu = (MenuItem) evt.getTarget();
        String menuLabel = clickedMenu.getText();

        if ("Play".equals(menuLabel)){
            ObservableList<Node> buttons = 
                    gameBoard.getChildren();

            buttons.forEach(btn -> {
                ((Button) btn).setText("");
                 btn.getStyleClass().remove("winning-button");
            });

            isFirstPlayer = true;
        }
        if("Quit".equals(menuLabel)) {

        }   
   } 

 }


public class Main extends Application {

Stage primaryStage;

@Override
public void start(Stage primaryStage) {
    try {
        BorderPane root = (BorderPane)FXMLLoader.load(getClass().getResource("KrizicKruzigIgra.fxml"));
        Scene scene = new Scene(root,300,320);
        scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
        primaryStage.setScene(scene);
        primaryStage.setResizable(false);
        primaryStage.show();

    } catch(Exception e) {
        e.printStackTrace();
    }
}

public void closeOPT(Stage primaryStage){
    primaryStage.close();
}

public static void main(String[] args) {
    launch(args);   
}}

1 Ответ

0 голосов
/ 22 сентября 2018

Если вы хотите иметь возможность завершить приложение JavaFX из любого места, используйте Platform.exit().

Заставляет приложение JavaFX завершаться.Если этот метод вызывается после вызова метода запуска приложения, то средство запуска JavaFX вызовет метод остановки приложения и завершит поток приложения JavaFX.Поток запуска будет отключен.Если нет запущенных потоков, не являющихся демонами, Java VM завершит работу.Если этот метод вызывается из метода Preloader или Application init, метод Application Application может не вызываться.

Этот метод может вызываться из любого потока.

Примечание: если приложениевстроен в браузер, тогда этот метод может не иметь никакого эффекта.


Другой способ - закрыть все открытые окна, пока Platform.isImplicitExit() возвращает true (см. Platform.setImplicitExit(boolean));похоже, именно это вы и пытались сделать в первую очередь.

if ("Quit".equals(menuLabel)) {
    // gameBoard is one of your @FXML annotated fields
    gameBoard.getScene().getWindow().hide();
}

Это работает, только если Window, к которому принадлежит gameBoard, является единственным открытием Window.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...