如何通过单击菜单中的“退出”来关闭程序? 我使用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);
}}
答案 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
时有效。