JavaFX:swing jfilechooser的使用

JavaFX:swing jfilechooser的使用,java,swing,javafx,jfilechooser,filechooser,Java,Swing,Javafx,Jfilechooser,Filechooser,首先,我知道我的问题可能会受到一些批评,因为JavaFX有自己的文件选择器(这在很大程度上优于/优于Swing的JFileChooser),应该劝阻混合使用FX和Swing。然而,我将解释我正在尝试构建的功能,如果我真的走错了方向,我非常愿意接受关于如何实现这些功能的建议 因此,首先,主要应用程序是在JavaFX中构建的,用于计算和归档生物样本的参数。主要可观察对象是选项卡窗格,其中为每个新样本生成选项卡的新实例。除了计算和归档每个样本的参数外,用户还可以存储与项目中每个样本相关的任何类型的数据

首先,我知道我的问题可能会受到一些批评,因为JavaFX有自己的文件选择器(这在很大程度上优于/优于Swing的JFileChooser),应该劝阻混合使用FX和Swing。然而,我将解释我正在尝试构建的功能,如果我真的走错了方向,我非常愿意接受关于如何实现这些功能的建议

因此,首先,主要应用程序是在JavaFX中构建的,用于计算和归档生物样本的参数。主要可观察对象是选项卡窗格,其中为每个新样本生成选项卡的新实例。除了计算和归档每个样本的参数外,用户还可以存储与项目中每个样本相关的任何类型的数据文件。这只是为了存档——我不打算与这些文件进行深入的交互。现在,我来自UNIX背景,非常希望我的“项目文件夹”有一个合理的数据结构,它可以共享、外部编辑和人类可读。在这方面,我的总体想法是使我保存的输出如下所示:


  • 根文件夹(即不是定制文件格式-只是经典文件夹)

  • 在根文件夹中:

    1。详细说明项目细节的主XML文件

    2。第二层文件夹-项目的每个选项卡一个


  • 在示例特定文件夹中:

    1。详细说明示例细节的XML文件

    2。与此示例相关的所有导入文件/数据


现在,我有了打开/保存功能,我的目标是使用Swing的JFileChooser。通过支持JFileChooser的自定义FileView类,我可以将特定类型的文件夹(与伪扩展名及其内部文件及其内容相关)定义为不可浏览,给它一个特定图标,然后使用filechooser打开它,实际上,就像它是一个真实的文件一样

然而,使用JavaFX选择器,这变得很复杂。由于DirectoryChooser不存在ShowSaveDialog方法,因此由于必须使用FileChooser.ShowSaveDialog(),您很容易在已存在的项目中错误地保存文件夹(而不是重写它)——至少在OSX中,这在系统文件资源管理器中没有很好地突出显示。另一个痛苦是,在选择文件夹时,它不会填充savename输入框,资源管理器只会下降到该目录中

同样,在打开文件夹时,FileChooser.ShowOpenDialog()显然是不合适的。在这里使用DirectoryChooser.ShowDialog()更容易接受,但是普通文件夹和项目相关文件夹之间的区别(即将它们设置为不可浏览并定义图标)在Swing的JFileChooser中处理得更好

因此,有人能推荐我如何从我的FX应用程序中打开JFileChooser吗?我曾尝试从SwingNode运行JFileChooser,但我认为我没有正确地实现它

    Dialog SaveDialog = new Dialog();
    SaveDialog.setTitle("Save Project");
    SaveDialog.setResizable(true);

    SwingNode swingnode = new SwingNode();

    JFileChooser SaveChooser = new JFileChooser();
    SaveChooser.setAcceptAllFileFilterUsed(false);
    FileNameExtensionFilter filter = new FileNameExtensionFilter(".prot projects", "*.prot");
    SaveChooser.setFileFilter(filter);
    SaveChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
    FileView view = new main.COBFileView();
    SaveChooser.setFileView(view);

    swingnode.setContent(SaveChooser);

    SaveDialog.getDialogPane().setContent(swingnode);
    Window window = SaveDialog.getDialogPane().getScene().getWindow();
    window.setOnCloseRequest(event -> window.hide());
    SaveDialog.showAndWait();    
或者,另一方面,如何使用FX复制此功能


任何帮助都将不胜感激

Swing和JavaFX使用不同的线程,因此您至少应该在Swing线程上创建和配置
JFileChooser
(同时将JavaFX代码保留在JavaFX应用程序线程上)。从零开始实现所需的文件选择器功能可能会更容易。抱歉,我对Java还是很陌生。请解释必要的代码或提供一个链接,说明我应该如何在Swing线程上配置JFileChooser?谢谢使用
SwingUtilities.invokeLater(…)
。将向您展示如何执行此操作。