2012-07-13 12 views
5

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.

Odpowiedz

21

Możesz uzyskać etap, który zostanie zamknięty z wydarzenia przekazanego do obsługi zdarzenia.

new EventHandler<ActionEvent>() { 
    @Override public void handle(ActionEvent actionEvent) { 
    // take some action 
    ... 
    // close the dialog. 
    Node source = (Node) actionEvent.getSource(); 
    Stage stage = (Stage) source.getScene().getWindow(); 
    stage.close(); 
    } 
} 
+8

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

+1

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. –

1

W JavaFX 2.1 masz niewiele możliwości. Sposób, jak odpowiedzieć jewelsea lub drodze, co zrobiłeś już lub zmodyfikowanej wersji tego jak

public class AboutBox extends Stage { 

    public AboutBox() throws Exception { 
     initModality(Modality.APPLICATION_MODAL); 
     Button btn = new Button("Close"); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent arg0) { 
       close(); 
      } 
     }); 

     // Load content via 
     // EITHER 

     Parent root = FXMLLoader.load(getClass().getResource("AboutPage.fxml")); 
     setScene(new Scene(VBoxBuilder.create().children(root, btn).build())); 

     // OR 

     Scene aboutScene = new Scene(VBoxBuilder.create().children(new Text("About me"), btn).alignment(Pos.CENTER).padding(new Insets(10)).build()); 
     setScene(aboutScene); 

     // If your about page is not so complex. no need FXML so its Controller class too. 
    } 
} 

z użytkowania jak

new AboutBox().show(); 

w punkcie menu obsługi zdarzeń działanie.

+0

W rzeczywistości mają nieco trudności z rozwiązaniem. Wygląda na to, że nie podoba im się pierwsza wersja z FXML. – Meg

+0

Problem polega na tym, że nazywasz klasę AboutBox.java, która sama powinna być klasą kontrolną dla pliku AboutBox.fxml. O ile nie był to powód, dla którego napisałeś AboutPage.fxml < – Meg

+0

@Meg. Zaktualizowano odpowiedź. AboutBox.java nie jest też kontrolerem AboutBox.fxml ani AboutPage.fxml. –