2012-05-07 21 views
32

Non riesco a capire come creare una finestra modale in JavaFX. Fondamentalmente ho selettore di file e voglio chiedere all'utente una domanda quando selezionano un file. Ho bisogno di queste informazioni per analizzare il file, quindi l'esecuzione deve attendere la risposta.Come creare una finestra modale in JavaFX 2.1

Ho visto this question ma non sono riuscito a scoprire come implementare questo comportamento.

risposta

33

Ecco link to a solution Ho creato in precedenza per le finestre di dialogo modali in JavaFX 2.1 La soluzione crea uno stage modale in cima allo stage corrente e agisce sui risultati della finestra di dialogo tramite i gestori di eventi per i controlli di dialogo.

Aggiornamento

La soluzione legata prima utilizza un approccio datato gestore di eventi di agire dopo una finestra di dialogo è stato respinto. Questo approccio era valido per le implementazioni pre-JavaFX 2.2. Per JavaFX 8+ non è necessario per i gestori di eventi, invece, utilizzare il nuovo metodo Stage showAndWait(). Per esempio:

Stage dialog = new Stage(); 

// populate dialog with controls. 
... 

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

// process result of dialog operation. 
... 

Si noti che, affinché le cose a funzionare come previsto, è importante per inizializzare il proprietario dello stage e per inizializzare la modalità dello stage, per uno o WINDOW_MODALAPPLICATION_MODAL.

Ci sono alcune finestre di dialogo dell'interfaccia utente standard di alta qualità in JavaFX 8 e ControlsFX, se soddisfano le vostre esigenze, vi consiglio di utilizzarle piuttosto che svilupparle da soli. Quelle in-built JavaFX Dialog e Alert classi hanno anche initOwner e initModality e showAndWait metodi, in modo che è possibile impostare la modalità per loro come si desidera (si noti che, per impostazione predefinita, le finestre di dialogo integrate sono modali dell'applicazione).

+3

biblioteca ControlsFX è stato sviluppato per JavaFX versione 8.0 e superiori, in uscita nel Q1 2014, quindi si deve prendere in considerazione. – bazeusz

+0

@jewelsea c'è qualche funzione filechooser per javafx 1.3? –

+0

Avinash, è meglio porre una nuova domanda come una nuova domanda. JavaFX 1.3 è obsoleto, non è consigliabile utilizzarlo. Non penso che abbia avuto direttamente un FileChooser, anche se potresti essere in grado di usare uno Swing [JFileChooser] (https://docs.oracle.com/javase/8/docs/api/javax/swing/JFileChooser.html) con esso. – jewelsea

59

Secondo me questa soluzione non è buona, perché la finestra padre è sempre attiva.
per esempio se si desidera che la finestra aperta come modale dopo scatto del tasto ...

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(); 
} 

adesso Il tuo nuova finestra è modale REALY - genitore è isolato. Inoltre è possibile utilizzare

Modality.APPLICATION_MODAL 
+2

Ho dovuto usare stage.initModality (Modality.APPLICATION_MODAL); per bloccare il genitore chiamante. Anche l'uso di showAndWait() non ha bloccato il chiamante (stavo chiamando da un JFXPanel, non sono sicuro che ciò abbia fatto qualche differenza) – torwalker

+1

Questa dovrebbe essere la risposta accettata –

-1

È possibile creare un'applicazione come il mio campione. Questa è solo un'applicazione JavaFX a file singolo.

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

Potrebbe migliorare la qualità della tua risposta se hai aggiunto una spiegazione di cosa sulla tua risposta che pensi possa aiutare e perché. – toonice

Problemi correlati