Как закрыть окно 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();
}
Ответ 5
Хотя
getScene().getWindow();
на a Node
выйдет на сцену с контроллера, важно отметить, что вызов close()
или hide()
эквивалентен, и просто сделает окно входа в систему невидимым. Что касается использования dispose()
:
Эта ссылка может помочь устранить любую путаницу.