muszę zamknąć bieżące okno fxml kodem w kontrolerzezamknij okno fxml kodem, JavaFX
wiem stage.close() lub stage.hide() to zrobić w fx
jak zaimplementować to w fxml? Próbowałem:
ale to nie działa!
Cała pomoc zostanie bardzo doceniona. Dzięki!
muszę zamknąć bieżące okno fxml kodem w kontrolerzezamknij okno fxml kodem, JavaFX
wiem stage.close() lub stage.hide() to zrobić w fx
jak zaimplementować to w fxml? Próbowałem:
ale to nie działa!
Cała pomoc zostanie bardzo doceniona. Dzięki!
<Button fx:id="closeButton" onAction="#closeButtonAction">
W swojej klasie kontrolera:
@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();
}
Nie jestem pewien, czy to najlepszy sposób (czy to działa), ale można spróbować:
private void on_btnClose_clicked(ActionEvent actionEvent) {
Window window = getScene().getWindow();
if (window instanceof Stage){
((Stage) window).close();
}
}
(Zakładając, że kontroler jest węzłem przeciwnym razie trzeba uzyskać węzeł pierwszy. (getScene() to metoda Node)
Jeśli masz okno, które rozszerza się o javafx.application.Application;
, możesz skorzystać z poniższej metody.
Platform.exit();
przykład:
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();
}
}
edycji dla urody Java 8:
public class MainGUI extends Application {
.........
Button exitButton = new Button("Exit");
exitButton.setOnAction(actionEvent -> Platform.exit());
}
'Platform.exit()' zamknie wszystkie etapy i zestrzelił całą aplikację. To może nie być pożądane. – nonybrighto
Oryginalny plakat był pytaniem, jak zamknąć okno (etap), a nie aplikację. –
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
public void handle(WindowEvent we) {
Platform.setImplicitExit(false)
stage.close()
}
});
jest równoważne hide
. Więc kiedy zamierzasz go otworzyć następnym razem, po prostu sprawdź, czy obiekt stage
jest zakończony, czy nie. Jeśli zostanie zakończone, po prostu show()
, tj. (stage.show())
połączenia. W przeciwnym razie musisz rozpocząć etap.
Zaimplementowałem to w następujący sposób po otrzymaniu NullPointerException
z zaakceptowanej odpowiedzi.
W moim FXML:
<Button onMouseClicked="#onMouseClickedCancelBtn" text="Cancel">
W moim Controller
Klasa:
@FXML public void onMouseClickedCancelBtn(InputEvent e) {
final Node source = (Node) e.getSource();
final Stage stage = (Stage) source.getScene().getWindow();
stage.close();
}
Znalazłem ładne rozwiązanie, które nie wymaga zdarzenie być wyzwalany:
@FXML
private Button cancelButton;
close(new Event(cancelButton, stage, null));
@FXML
private void close(Event event) {
((Node)(event.getSource())).getScene().getWindow().hide();
}
cię można to osiągnąć za pomocą,
@FXML
private void closeAction(ActionEvent evt){
System.exit(0);
}
zrobi za Ciebie.
To podejście nie działa dla mnie. Otrzymuję niesamowite dzieło 'NullPointerException' –
! , na wszelki wypadek, ludzie pamiętają, sprawdź nazwę swojego przycisku (ten przypadek closeButton) i nazwę swojego onClick (w tym przypadku closeButtonAction) –
Zamyka tylko okno, ale aplikacja nadal działa !!! –