如何在JavaFX2.1中创建模式窗口

如何在JavaFX2.1中创建模式窗口,javafx,javafx-2,Javafx,Javafx 2,我不知道如何在JavaFX中创建模式窗口。基本上,我有文件选择器,我想问用户一个问题,当他们选择一个文件。我需要这些信息来解析文件,因此执行需要等待答案 我已经看到了,但是我还没有找到如何实现这种行为 这里是我之前在JavaFX2.1中为模态对话框创建的 该解决方案在当前阶段的顶部创建一个模式阶段,并通过对话框控件的事件处理程序对对话框结果执行操作 更新 先前的链接解决方案使用日期事件处理程序方法在对话框取消后执行操作。这种方法对于JavaFX2.2之前的实现是有效的。对于JavaFX8+来说,

我不知道如何在JavaFX中创建模式窗口。基本上,我有文件选择器,我想问用户一个问题,当他们选择一个文件。我需要这些信息来解析文件,因此执行需要等待答案

我已经看到了,但是我还没有找到如何实现这种行为

这里是我之前在JavaFX2.1中为模态对话框创建的 该解决方案在当前阶段的顶部创建一个模式阶段,并通过对话框控件的事件处理程序对对话框结果执行操作

更新

先前的链接解决方案使用日期事件处理程序方法在对话框取消后执行操作。这种方法对于JavaFX2.2之前的实现是有效的。对于JavaFX8+来说,不需要事件处理程序,而是使用新的Stage方法。例如:

Stage dialog = new Stage();

// populate dialog with controls.
...

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

// process result of dialog operation. 
... 
请注意,为了使事情按预期工作,初始化阶段的所有者和将阶段的模态初始化为或非常重要


中有一些高质量的标准UI对话框,如果它们符合您的要求,我建议您使用这些对话框,而不是开发自己的对话框。那些内置的JavaFX和类也有and和方法,因此您可以根据需要为它们设置模态(请注意,默认情况下,内置对话框是应用程序模态)。

我认为这不是一个好的解决方案,因为父窗口始终处于活动状态。
例如,如果您希望在单击按钮后以模态方式打开窗口

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();
}
现在您的新窗口是实模态的-父窗口是块。 你也可以使用

Modality.APPLICATION_MODAL

您可以像我的示例一样创建应用程序。这是唯一一个单文件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);
    }
}
公共类JavaFXApplication1扩展应用程序{
@凌驾
公共无效开始(阶段primaryStage){
按钮btn=新按钮();
btn.setText(“说‘你好,世界’”);
btn.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
阶段性;
阶段=新阶段();
最终SwingNode SwingNode=新SwingNode();
创建SwingContent(swingNode);
StackPane=新的StackPane();
pane.getChildren().add(swingNode);
阶段.初始模态(模态.应用\模态);
stage.setTitle(“JavaFX中的Swing”);
舞台场景(新场景(窗格,250150));
stage.show();
}
});
StackPane root=新的StackPane();
root.getChildren().add(btn);
场景=新场景(根,300,250);
setTitle(“你好,世界!”);
初级阶段。场景(场景);
primaryStage.show();
}
私有void createSwingContent(最终SwingNode SwingNode){
SwingUtilities.invokeLater(()->{
试一试{
Path currentRelativePath=Path.get(“”);
字符串s=currentRelativePath.toAbsolutePath().toString();
JasperDesign JasperDesign=jrxmloader.load(s+“/src/reports/report1.jrxml”);
String query=“从“accounttype”中选择*”;
JRDesignQuery jrquery=新建JRDesignQuery();
jrquery.setText(查询);
setQuery(jrquery);
JasperReport-JasperReport=JasperCompileManager.compileReport(jasperDesign);
JasperPrint-JasperPrint=JasperFillManager.fillReport(jaspereport,null,c);
//JRViewer=新的JRViewer(JasperPrint);
setContent(新的JRViewer(JasperPrint));
}捕获(JREX异常){
Logger.getLogger(AccountTypeController.class.getName()).log(Level.SEVERE,null,ex);
}
});
}
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args){
发射(args);
}
}

ControlsFX库是为JavaFX 8.0及以上版本开发的,将于2014年第1季度发布,因此必须考虑到这一点。@jewelsea JavaFX 1.3是否有文件选择器功能?Avinash,最好以新问题的形式提出新问题。JavaFX1.3已经过时了,我不建议使用它。我不认为它直接有一个FileChooser,尽管您可能可以使用Swing;阻止调用父对象。即使使用showAndWait()也不能阻止调用者(我是从JFXPanel调用的,不确定这是否有什么不同)。如果您添加一个解释,说明您认为答案会有什么帮助以及原因,可能会提高您答案的质量。