it-swarm.com.ru

Как закрыть окно Java нажатием кнопки - JavaFX Project

Я сделал проект 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);
    }

}

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

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

14
Aristomenis

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

@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" />

Это закроет стадию, на которой эта кнопка включена.

25
Moh-Aw

Использование 

stage.hide()

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

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

Похож на другие ответы, но точнее.

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

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

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

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

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

4
Aristomenis

Хотя

    getScene().getWindow();

на Node вы получите этап от контроллера, важно отметить, что вызовы close() или hide() эквивалентны и просто сделают окно входа невидимым. Что касается использования dispose():

Эта ссылка может помочь устранить путаницу.

0
Forager