8

ファイルを保存するためのダイアログを作成するために java.awt.FileDialog を使用しています。問題は、提案された (既定の) ファイル名を指定すると、FileDialog がその拡張子を削除することです。例:

import java.awt.*;
import java.io.*;

public class SaveFile {
    public static void main(String[] args) {
        FileDialog fileDialog = new FileDialog(new Frame(), "Save", FileDialog.SAVE);
        fileDialog.setFilenameFilter(new FilenameFilter() {
            public boolean accept(File dir, String name) {
                return name.endsWith(".txt");
            }
        });
        fileDialog.setFile("Untitled.txt");
        fileDialog.setVisible(true);
        System.out.println("File: " + fileDialog.getFile());
    }
}

FileDialog が表示されたとき、デフォルトのファイル名は「Untitled.txt」ですが、代わりに「Untitled」になっていると思います。ユーザーが [保存] をクリックすると、拡張子のないファイル名が返されます。FileDialog は、Windows と OS X の両方でこれを行います。

理解できません。FileDialog が意図的に拡張子を削除するのはなぜですか? これには何らかの論理的な理由がありますか?ドキュメントはそれについて議論していません。回避策として、FileDialog が返す文字列に拡張子を追加するだけで済みますが、それでもバグのようです...

(JFileChooser は使用できないことに注意してください。ネイティブの AWT FileDialog が必要です。)

4

4 に答える 4

2

これは、Sun Java 1.5 および 1.6 を使用する Windows 7 では発生しません。

私が得る動作は、Windows エクスプローラーの [既知のファイルの種類の拡張子を非表示にする] の設定によって若干異なります。これがオンの場合、ご想像のとおり、ファイル ダイアログに拡張子が表示されませんが、完全なファイル名が返されます。

編集: AWT とネイティブ ウィジェットについて、私が間違っていたことを認識してください。AWT と Swing を混同しています。

于 2011-02-28T16:26:31.403 に答える
2

FileDialog から指定されたディレクトリとファイル名に新しいファイルを保存する方法の例を次に示します。文字列は、文字列のベクトルから取得されます。

public static void SaveFileTo(Vector<String> myLines) {
        FileOutputStream f = null;
        DataOutputStream h = null;
        FileDialog d = new FileDialog(new JFrame(), "Save", FileDialog.SAVE);
        d.setVisible(true);
        String dir;
        dir = d.getDirectory();
        File oneFile = new File(dir + d.getFile());
        try {
            oneFile.createNewFile();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        try {
            f = new FileOutputStream(oneFile);
            h = new DataOutputStream(f);
            for (String de : myLines) {
                h.writeBytes(de);               
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            try {
                h.close();
                f.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }
于 2015-08-18T08:13:58.953 に答える
2

私は、Mac でのみ発生するこのまったく同じ問題に対する答えを探していました。醜い JFileChooser (swing、軽量、ネイティブの外観ではない) オプションを使用するか、if (os は mac) を使用して、自分でファイル拡張子を末尾に付けることで別の方法で処理する必要があります。

これは Mac Java AWT のバグであり、いつか修正されることを願っています。

于 2011-09-22T16:26:58.207 に答える
-1

JFileChooser を使用しますが、それをプログラムの先頭に置きます。

    try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (Exception e) {
        e.printStackTrace();
    }
于 2012-06-16T22:16:39.903 に答える