Как закрыть окно java с нажатием кнопки - Проект JavaFX

Я создал проект JavaFX и создал графический интерфейс для фрейма первого входа в java Scene Builder. При успешном входе в систему входной кадр должен быть закрыт, а следующий кадр должен быть видимым (основной программный кадр). Я могу создать новый кадр, но я не могу сделать рамку входа закрытой. Я пробовал такие вещи, как dispose(), но ничего не работает. Ниже приведен код для основного класса:

public class KuberComm extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));

        Scene scene = new Scene(root);
        stage.setResizable(false);
        stage.setTitle("Login to KuberComm");
        stage.setScene(scene);

        stage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}

Обработчик для кнопки входа в систему находится в другом классе (класс контроллера, созданный средой NetBeans). Я не могу понять, каково имя фрейма, чтобы использовать его в классе контроллера.

Любая помощь будет высоко оценена!

Ответ 1

присвоить вашей кнопке имя в классе контроллера:

@FXML
public Button closeButton;

и добавьте этот метод:

@FXML
public void handleCloseButtonAction(ActionEvent event) {
    Stage stage = (Stage) closeButton.getScene().getWindow();
    stage.close();
}

В вашем FXML вам нужна ссылка на имя кнопки и метод вызова onAction:

<Button fx:id="closeButton" cancelButton="true" layoutX="350.0" layoutY="767.0" mnemonicParsing="false" onAction="#handleCloseButtonAction" prefWidth="100.0" text="Close" />

Это закроет этап, на котором эта кнопка включена.

Ответ 2

Используйте

stage.hide()

Если вы сделаете это с контроллера, вы можете получить сцену из любого Node внутри сцены сцены (при необходимости пусть загрузчик FXML назначит его полю поля контроллера с помощью атрибута id из fxml namespace в файле fxml):

Window stage = node.getScene().getWindow();

Ответ 3

Спасибо за ваше время, чтобы ответить, но в конце концов я узнал, как это исправить. Я использовал

((Node)(event.getSource())).getScene().getWindow().hide();

в if, который отвечает за успешный вход в систему. Я имею в виду, что после появления диалогового окна, информирующего пользователя об успешном входе в систему, этот код идет туда.

(Я импортировал нужный материал, чтобы сделать эту строку кода)

Ответ 4

Как и другие ответы, но более точные.

@FXML
public void handleCloseButtonAction(ActionEvent event) {
    ((Stage)(((Button)event.getSource()).getScene().getWindow())).close();
}