【问题标题】:JavaFX FileChooser Filefilter not returning extensionJavaFX FileChooser Filefilter不返回扩展名
【发布时间】:2015-09-24 09:03:21
【问题描述】:

在我的项目中,我使用 JavaFX FileChooser 让用户保存文件。我注意到一个错误,即具有指定文件过滤器的文件在 Linux 系统上总是会另存为 .txt。从另一个 stackoverflow 线程中,我认为与 Windows 不同,在 Linux 上 fileChooser.showSaveDialog(); 返回一个没有所选文件扩展名的文件。我有信心,这种不规则的实施有一个我不理解的非常明显的原因。但我仍然不确定如何根据我的需要调整它。

我知道还有一些关于类似主题的其他已解决线程,但所有解决方案都是基于从返回的文件中提取扩展名,在我的例子中,showSaveDialog 没有返回扩展名。

【问题讨论】:

    标签: java javafx filechooser


    【解决方案1】:

    这是一个示例,如果用户没有使用他们选择的过滤器键入扩展名,则添加扩展名:

    @Override
    public void start(Stage primaryStage) {
        Button btn = new Button();
        btn.setText("Save to file.");
        btn.setOnAction(new EventHandler<ActionEvent>() {
    
            @Override
            public void handle(ActionEvent event) {
                FileChooser fc = new FileChooser();
                FileChooser.ExtensionFilter xmlfilter = new FileChooser.ExtensionFilter("XML", "*.xml");
                FileChooser.ExtensionFilter mffilter = new FileChooser.ExtensionFilter("mf", "*.mf");
                fc.getExtensionFilters().addAll(xmlfilter,mffilter);
                fc.setSelectedExtensionFilter(xmlfilter);
                File f = fc.showSaveDialog(primaryStage.getOwner());
                System.out.println("f = " + f);
                if(null == f) {
                    return;
                }
                final String selected_description = fc.getSelectedExtensionFilter().getDescription();
                System.out.println("selected_description = " + selected_description);          
                if(selected_description.equals(xmlfilter.getDescription()) && !f.getName().endsWith(".xml")) {
                    f = new File(f.getParent(),f.getName()+".xml"); 
                } else if(selected_description.equals(mffilter.getDescription()) && !f.getName().endsWith(".mf")) {
                    f = new File(f.getParent(),f.getName()+".mf");
                }
                System.out.println("f = " + f);
            }
        });
    
        StackPane root = new StackPane();
        root.getChildren().add(btn);
    
        Scene scene = new Scene(root, 300, 250);
    
        primaryStage.setTitle("Example");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    

    我在 linux 上对其进行了测试,但从未见过它添加了 .txt。给定的扩展过滤器可能有多个扩展,因此您必须任意选择一个来添加。

    【讨论】:

    • 道歉。我应该自己发现 getSelectedExtensionFilter() 。我只是直接从 showSaveDialog() 返回文件,而没有考虑使用该对象来收集更多信息。但是虽然这是对我的问题的适当回答,但保存文件的问题仍然存在:如何处理重复的扩展名;在覆盖的情况下如何提示。我想我只是期待 FileChooser 已经提供了一个我缺少的简单解决方案。但话又说回来,答案从来都不是简单的。但无论如何,谢谢你的回答:)
    猜你喜欢
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 2014-06-05
    • 2019-04-24
    • 1970-01-01
    • 2014-08-31
    相关资源
    最近更新 更多