закрыть окно fxml по коду, javafx
Мне нужно закрыть текущее окно fxml кодом в контроллере
Я знаю сцену.закрыть () или этап.hide () сделайте это в fx
как реализовать это в fxml? Я пытался!--2-->
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();
}
}
редактировать для красоты Java 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 () - это метод Node)
Я нашел хорошее решение, которое не требует запуска события:
@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())
звонок. Иначе придется начинать сцену.