закрыть окно FXML-файл по коду, в JavaFX
Мне нужно закрыть текущее окно fxml кодом в контроллере
Я знаю стадию.close () или stage.hide() сделайте это в fx
Как реализовать это в fxml? Я пытался
private void on_btnClose_clicked(ActionEvent actionEvent) {
Parent root = FXMLLoader.load(getClass().getResource("currentWindow.fxml"));
Scene scene = new Scene(root);
Stage stage = new Stage();
stage.setScene(scene);
stage.show();
}
Но это не работает!
Вся помощь будет очень признательна. Спасибо!
7 ответов:
- Дайте вашей кнопке закрытия fx: id, если вы еще не сделали этого:
<Button fx:id="closeButton" onAction="#closeButtonAction">
В вашем классе контроллера:
@FXML private javafx.scene.control.Button closeButton; @FXML private void closeButtonAction(){ // get a handle to the stage Stage stage = (Stage) closeButton.getScene().getWindow(); // do what you have to do stage.close(); }
Если у вас есть окно, которое расширяет
javafx.application.Application;
, Вы можете использовать следующий метод.Platform.exit();
Пример:
public class MainGUI extends Application { ......... Button exitButton = new Button("Exit"); exitButton.setOnAction(new ExitButtonListener()); ......... public class ExitButtonListener implements EventHandler<ActionEvent> { @Override public void handle(ActionEvent arg0) { Platform.exit(); } }
Править ради красоты Явы 8:
public class MainGUI extends Application { ......... Button exitButton = new Button("Exit"); exitButton.setOnAction(actionEvent -> Platform.exit()); }
Я реализовал это следующим образом после получения
NullPointerException
от принятого ответа.В моем FXML:
<Button onMouseClicked="#onMouseClickedCancelBtn" text="Cancel">
В моем классе
Controller
:@FXML public void onMouseClickedCancelBtn(InputEvent e) { final Node source = (Node) e.getSource(); final Stage stage = (Stage) source.getScene().getWindow(); stage.close(); }
Я не уверен, что это лучший способ (или если он работает), но вы могли бы попробовать:
private void on_btnClose_clicked(ActionEvent actionEvent) { Window window = getScene().getWindow(); if (window instanceof Stage){ ((Stage) window).close(); } }
(предполагая, что ваш контроллер является узлом. В противном случае сначала нужно получить узел (getScene () - это метод узла)
Я нашел хорошее решение, которое не требует запуска события:
@FXML private Button cancelButton; close(new Event(cancelButton, stage, null)); @FXML private void close(Event event) { ((Node)(event.getSource())).getScene().getWindow().hide(); }
Вы можете просто достичь этого с помощью,
@FXML private void closeAction(ActionEvent evt){ System.exit(0); }
Сделает трюк за вас.
stage.setOnCloseRequest(new EventHandler<WindowEvent>() { public void handle(WindowEvent we) { Platform.setImplicitExit(false); stage.close(); } });
Эквивалентно
hide
. Поэтому, когда вы собираетесь открыть его в следующий раз, вы просто проверяете, вышел ли объектstage
или нет. Если он вышел, вы простоshow()
т. е.(stage.show())
звоните. В противном случае, вы должны начать сцену.