JavaFX退出menuItem

时间:2018-09-22 12:22:53

标签: java javafx

如何通过单击菜单中的“退出”来关闭程序? 我使用Scene Builder和FXML进行工作,因此我尝试在主类中创建一个closeOPT()方法,该方法包含用于关闭我的应用程序的代码,但是当我在控件中创建实例时,它不起作用。所以现在,我不知道如何使其工作。 我还尝试在主类中使用FXML id连接close方法,但这也没有用。

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 :(得分:2)

如果您希望能够从任何地方终止JavaFX应用程序,请使用Platform.exit()

  

导致JavaFX应用程序终止。如果在调用Application start方法之后调用此方法,则JavaFX启动程序将调用Application stop方法并终止JavaFX应用程序线程。然后启动器线程将关闭。如果没有其他非守护程序线程在运行,则Java VM将退出。如果从Preloader或Application init方法调用此方法,则可能不会调用Application stop方法。

     

可以从任何线程调用此方法。

     

注意:如果应用程序嵌入在浏览器中,则此方法可能无效。


另一种方法是关闭所有打开的窗口,只要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时有效。