2012-05-07 15 views
32

Nie mogę dowiedzieć się, jak utworzyć okno modalne w JavaFX. Zasadniczo mam wybieracz plików i chcę zadać użytkownikowi pytanie po wybraniu pliku. Potrzebuję tych informacji, aby przeanalizować plik, więc wykonanie musi poczekać na odpowiedź.Jak utworzyć okno modalne w JavaFX 2.1

Widziałem this question, ale nie byłem w stanie dowiedzieć się, jak zaimplementować to zachowanie.

Odpowiedz

33

Oto link to a solution Utworzone wcześniej dla dialogów modalnych w JavaFX 2.1 Rozwiązanie tworzy etap modalny nad bieżącym etapem i podejmuje działania w oknie dialogowym wyników za pośrednictwem procedur obsługi zdarzeń dla formantów okna dialogowego.

Aktualizacja

Wcześniejsze powiązane rozwiązanie wykorzystuje datowane podejście obsługi zdarzeń do podjęcia działań po dialogowe został odwołany. Takie podejście dotyczyło implementacji pre-JavaFX 2.2. W przypadku JavaFX 8+ nie ma potrzeby używania handlerów zdarzeń, zamiast tego należy użyć nowej metody Stage showAndWait(). Na przykład:

Stage dialog = new Stage(); 

// populate dialog with controls. 
... 

dialog.initOwner(parentStage); 
dialog.initModality(Modality.APPLICATION_MODAL); 
dialog.showAndWait(); 

// process result of dialog operation. 
... 

zauważyć, że w postanowieniu rzeczy działają zgodnie z oczekiwaniami, ważne jest, aby zainicjować właściciela Stage i zainicjować modalność stole montażowym albo WINDOW_MODAL lub APPLICATION_MODAL.

Istnieje kilka wysokiej jakości standardowych okien dialogowych interfejsu użytkownika w JavaFX 8 i ControlsFX, jeśli pasują one do twoich wymagań, radzę używać tych zamiast rozwijać własne. Te wbudowane klasy JavaFX Dialog i Alert mają również metody initOwner i initModality i , dzięki czemu można ustawić ich modalność według własnego uznania (należy zauważyć, że domyślnie wbudowane okna dialogowe są modalne).

+3

Biblioteka ControlsFX została opracowana dla JavaFX w wersji 8.0 lub wyższej i zostanie wydana w pierwszym kwartale 2014 r., Więc należy wziąć to pod uwagę. – bazeusz

+0

@jewelsea Czy istnieje funkcja filechooser dla javafx 1.3? –

+0

Avinash, najlepiej zadać nowe pytanie jako nowe pytanie. JavaFX 1.3 jest przestarzały, nie radzę go używać. Nie sądzę, że miał bezpośrednio FileChooser, ale możesz użyć Swinga [JFileChooser] (https://docs.oracle.com/javase/8/docs/api/javax/swing/JFileChooser.html) z tym. – jewelsea

59

Moim zdaniem nie jest to dobre rozwiązanie, ponieważ okno nadrzędne jest cały czas aktywne.
Na przykład, jeśli chcesz otwarte okna jako modalnym po kliknięciu przycisku ...

private void clickShow(ActionEvent event) { 
    Stage stage = new Stage(); 
    Parent root = FXMLLoader.load(
     YourClassController.class.getResource("YourClass.fxml")); 
    stage.setScene(new Scene(root)); 
    stage.setTitle("My modal window"); 
    stage.initModality(Modality.WINDOW_MODAL); 
    stage.initOwner(
     ((Node)event.getSource()).getScene().getWindow()); 
    stage.show(); 
} 

Teraz Twoje nowe okno jest naprawdę modalne - rodzic jest blok. również można użyć

Modality.APPLICATION_MODAL 
+2

Musiałem użyć stage.initModality (Modality.APPLICATION_MODAL); , aby zablokować połączenie z rodzicem. Nawet użycie showAndWait() nie blokowało dzwoniącego (dzwoniłem z JFXPanel-nie wiem, czy to miało jakikolwiek wpływ). – torwalker

+1

To powinna być zaakceptowana odpowiedź –

-1

Można utworzyć aplikację jak mój próbki. To jest tylko pojedyncza aplikacja JavaFX.

public class JavaFXApplication1 extends Application { 
    @Override 
    public void start(Stage primaryStage) { 
     Button btn = new Button(); 
     btn.setText("Say 'Hello World'"); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 
       Stage stage; 
       stage = new Stage(); 

       final SwingNode swingNode = new SwingNode(); 

       createSwingContent(swingNode); 

       StackPane pane = new StackPane(); 
       pane.getChildren().add(swingNode); 

       stage.initModality(Modality.APPLICATION_MODAL); 
       stage.setTitle("Swing in JavaFX"); 
       stage.setScene(new Scene(pane, 250, 150)); 
       stage.show(); 
      } 
     }); 

     StackPane root = new StackPane(); 
     root.getChildren().add(btn); 

     Scene scene = new Scene(root, 300, 250); 

     primaryStage.setTitle("Hello World!"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    private void createSwingContent(final SwingNode swingNode) { 
     SwingUtilities.invokeLater(() -> { 
      try { 
       Path currentRelativePath = Paths.get(""); 
       String s = currentRelativePath.toAbsolutePath().toString(); 
       JasperDesign jasperDesign = JRXmlLoader.load(s + "/src/reports/report1.jrxml"); 

       String query = "SELECT * FROM `accounttype`"; 
       JRDesignQuery jrquery = new JRDesignQuery(); 
       jrquery.setText(query); 
       jasperDesign.setQuery(jrquery); 

       JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign); 
       JasperPrint JasperPrint = JasperFillManager.fillReport(jasperReport, null, c); 
       //JRViewer viewer = new JRViewer(JasperPrint); 

       swingNode.setContent(new JRViewer(JasperPrint)); 
      } catch (JRException ex) { 
       Logger.getLogger(AccountTypeController.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     }); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+2

Może poprawić jakość twojej odpowiedzi, jeśli dodasz wyjaśnienie tego, co o twojej odpowiedzi, która Twoim zdaniem pomoże i dlaczego. – toonice

Powiązane problemy