2012-05-07 27 views
32

No puedo encontrar la manera de crear una ventana modal en JavaFX. Básicamente tengo selector de archivos y quiero hacerle una pregunta al usuario cuando seleccionan un archivo. Necesito esta información para analizar el archivo, por lo que la ejecución debe esperar la respuesta.Cómo crear una ventana modal en JavaFX 2.1

He visto this question pero no he podido encontrar la manera de implementar este comportamiento.

Respuesta

33

Aquí es link to a solution he creado anteriormente para cuadros de diálogo modales en JavaFX 2.1 La solución crea un escenario modal en la parte superior de la etapa actual y toma acción sobre los resultados de diálogo a través de controladores de eventos para los controles de diálogo.

actualización

La solución vinculados anterior utiliza un enfoque de controlador de eventos con fecha para tomar medidas después de un diálogo fue despedido. Ese enfoque era válido para las implementaciones anteriores a JavaFX 2.2. Para JavaFX 8+ no hay necesidad de ejecutores de eventos, en su lugar, use el nuevo método Stage showAndWait(). Por ejemplo:

Stage dialog = new Stage(); 

// populate dialog with controls. 
... 

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

// process result of dialog operation. 
... 

Tenga en cuenta que, para que las cosas funcionen como se espera, es importante para inicializar el propietario de la Etapa y para inicializar la modalidad de la etapa a cualquiera WINDOW_MODAL o APPLICATION_MODAL.

Hay algunos diálogos de IU estándar de alta calidad en JavaFX 8 y ControlsFX, si se ajustan a sus requisitos, le aconsejo usarlos en lugar de desarrollar los suyos propios. Las clases JavaFX Dialog y Alert incorporadas también tienen los métodos initOwner y initModality y showAndWait, de modo que puede establecer la modalidad para ellas como desee (tenga en cuenta que, de forma predeterminada, los diálogos incorporados son de aplicación modal).

+3

La biblioteca ControlsFX ha sido desarrollada para JavaFX versión 8.0 y superior, que se lanzará en el primer trimestre de 2014, por lo que hay que tenerla en cuenta. – bazeusz

+0

@jewelsea ¿hay alguna función de archivado de archivos para javafx 1.3? –

+0

Avinash, lo mejor es hacer una nueva pregunta como una nueva pregunta. JavaFX 1.3 es obsoleto, no aconsejo usarlo. No creo que tenga directamente un FileChooser, aunque es posible que pueda usar un Swing [JFileChooser] (https://docs.oracle.com/javase/8/docs/api/javax/swing/JFileChooser.html) con eso. – jewelsea

59

En mi opinión, esta no es una buena solución, porque la ventana principal está activa todo el tiempo.
Por ejemplo, si desea ventana abierta como modal después de clic de botón ...

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

ahora su nueva ventana es modal REALY - los padres es de bloques. También puede utilizar

Modality.APPLICATION_MODAL 
+2

Tuve que usar stage.initModality (Modality.APPLICATION_MODAL); para bloquear el padre que llama. Incluso el uso de showAndWait() no bloqueó a la persona que llama (estaba llamando desde un JFXPanel, no estoy seguro si eso hizo alguna diferencia.) – torwalker

+1

Esta debería ser la respuesta aceptada –

-1

Se pueden crear aplicaciones como mi muestra. Esta es solo una aplicación JavaFX de archivo único.

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

Puede mejorar la calidad de su respuesta si agrega una explicación de acerca de su respuesta que cree que ayudará y por qué. – toonice

Cuestiones relacionadas