JavaFX FileChooser Filefilter не возвращает расширение

В моем проекте я использую JavaFX FileChooser, чтобы позволить пользователю сохранять файлы. Я заметил ошибку, при которой файл с указанным фильтром файлов всегда сохранялся как.txt в системах Linux. Из другого потока stackru я опирался, что в отличие от Windows, в Linux fileChooser.showSaveDialog(); возвращает файл без выбранного расширения файла. Я уверен, что эта нерегулярная реализация имеет очень очевидную причину, которую я не понимаю. Но все же я не уверен, как адаптировать это для моих нужд.

Я знаю, что есть некоторые другие решенные темы по аналогичной теме, но все решения основаны на извлечении расширения из возвращаемого файла, где в моем случае расширение, возвращаемое showSaveDialog, не возвращается.

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. У данного фильтра расширений может быть несколько расширений, поэтому вам нужно будет выбрать одно из них для произвольного добавления.

Другие вопросы по тегам