Jestem nowicjuszem w JavaFx i tworzę aplikację i potrzebowałem czegoś podobnego do JDialog, które było oferowane podczas używania komponentów swing. Rozwiązałem to, tworząc nowy etap, ale teraz potrzebuję sposobu na zamknięcie nowego etapu od wewnątrz poprzez kliknięcie przycisku. (tak, przycisk x działa również, ale chciał go również na przycisku). Aby opisać sytuację: Mam główną klasę, z której tworzę główną scenę ze sceną. Używam FXML do tego.JavaFX2: Zamykanie etapu (podstacji) od wewnątrz
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("Builder.fxml"));
stage.setTitle("Ring of Power - Builder");
stage.setScene(new Scene(root));
stage.setMinHeight(600.0);
stage.setMinWidth(800.0);
stage.setHeight(600);
stage.setWidth(800);
stage.centerOnScreen();
stage.show();
}
Teraz w głównym oknie, które się pojawi mam wszystkich elementów sterujących i menu i rzeczy, wykonane przez FXML i odpowiedniej klasie kontrolnej. To jest ta część, w której zdecydowałem się zamieścić informacje o programie w menu Pomoc. Więc mam zdarzenie dzieje się, gdy menu Pomoc - O uaktywnieniu tak:
@FXML
private void menuHelpAbout(ActionEvent event) throws IOException{
Parent root2 = FXMLLoader.load(getClass().getResource("AboutBox.fxml"));
Stage aboutBox=new Stage();
aboutBox.setScene(new Scene(root2));
aboutBox.centerOnScreen();
aboutBox.setTitle("About Box");
aboutBox.setResizable(false);
aboutBox.initModality(Modality.APPLICATION_MODAL);
aboutBox.show();
}
Jak widać oknie O Box jest tworzony poprzez FXML z klasy sterowania ponownie. Jest obraz, obszar tekstowy i przycisk, i chcę, aby ten przycisk zamknął nowy etap, który jest oBox z klasy AboutBox.java, że tak powiem.
Jedynym sposobem, w jaki mogłem to zrobić, było zdefiniowanie publicznej statycznej sceny oBox; wewnątrz klasy Builder.java i odniesienie do niej w metodzie AboutBox.java w metodzie, która obsługuje zdarzenie akcji na przycisku zamykającym. Ale jakoś nie wydaje się dokładnie czyste i właściwe. Czy istnieje lepszy sposób?
Z góry dziękuję za porady.
Zamknij etap w ten sposób pomija procedurę obsługi zdarzenia onCloseRequest (jeśli istnieje). Dodałbym linię stage.getOnCloseRequest(). Handle (null); tuż przed stage.close(); – beardedlinuxgeek
Dziękuję @beardedlinuxgeek. Miałem ten problem - moje okno było zamknięte, ale program obsługi zdarzeń, który zarejestrowałem, nie był wywoływany. Twoje rozwiązanie naprawiło problem. –