【问题标题】:JavaFx FileChooser without Stage没有阶段的 JavaFx FileChooser
【发布时间】:2016-08-29 00:24:14
【问题描述】:

我正在学习JavaFx,遇到了一个问题。我试图使用 JavaFx 中的 FileChooser,就像我习惯在 main() 方法中使用 Swing 中的 JFileChooser 一样。但是我发现我需要一个 Window 对象。我试过寻找解决方法,但没有找到。我还尝试了 null(就像您在 JFileChooser 中所做的那样)和 new Stage(),所以这些都不在讨论范围内。我试图模仿 JFileChooser.showOpenDialog()。有什么合理的方法让它工作吗?

【问题讨论】:

    标签: java javafx jfilechooser stage filechooser


    【解决方案1】:

    main 方法不在 FX 应用程序线程上执行,因此您无法从中显示 FileChooser。 (你也不能在 Swing 中真正做到这一点,除非你使用 SwingUtilities.invokeLater(...)。)

    在 JavaFX 中,启动应用程序的责任在 start() 方法中,该方法在 FX 应用程序线程上执行。 (在许多运行时环境中,您甚至不需要在 JavaFX 应用程序中使用 main 方法。)

    只需从 start 方法中显示文件选择器,您可以在其中访问primaryStage(或者如果您愿意,可以直接传递null):

    public class MyApp extends Application {
    
        public void start(Stage primaryStage) {
            FileChooser configFileChooser = new FileChooser();
            File configFile = configFileChooser.showOpenDialog(primaryStage);
    
            // ... parse file and create UI, etc...
    
            primaryStage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    【讨论】:

    • 我在 Swing 中可以做的是 JFileChooser jfc = new JFileChooser(); if(jfc.showOpenDialog(null)==JFileChooser.APPROVE_OPTION){ mapFile=jfc.getSelectedFile(); } 代码中的任何地方(包括 main())
    • 仅仅因为你能做到,而且它恰好在你的特定平台上运行,并不能使它正确。 Swing 中的代码不正确:它显示了来自不是事件调度线程的线程的JFileChooser。不能保证它可以在其他平台上或在未来的版本中运行。这是一个非常常见的错误,因此 JavaFX 会不厌其烦地检查线程(在许多情况下),如果不正确则抛出异常。
    • 从不知道这是错的......在听众中可以吗(对我来说最常用)?
    • 当然,因为监听器是在事件派发线程上执行的(它们是作为事件派发过程的一部分执行的)。如果您阅读documentation for any swing class,它会说“警告: Swing 不是线程安全的。有关更多信息,请参阅Swing's Threading Policy”,并且该链接完全描述了所有限制。
    猜你喜欢
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 2015-05-09
    相关资源
    最近更新 更多