在Java中保存FileDialog剥离初始文件扩展名

时间:2011-02-28 16:18:43

标签: java awt filedialog

我正在使用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 个答案:

答案 0 :(得分:2)

对于我来说,在Windows 7上使用Sun Java 1.5和1.6不会发生这种情况。

我得到的行为略微取决于Windows资源管理器中“隐藏已知文件类型的扩展名”的设置。如果那个打开了,那么我没有像你期望的那样在文件对话框中看到扩展名,但它确实返回了我的完整文件名。

编辑:意识到我对AWT和本机小部件的错误 - 混淆了AWT和Swing。

答案 1 :(得分:2)

我一直在寻找这个同样问题的答案,这个问题只出现在Mac上。 你要么必须使用丑陋的JFileChooser(摇摆,轻量级,而不是本机外观)选项,要么拥有if(os是mac)并通过自己将文件扩展名放在最后来处理事情。

这是一个Mac Java AWT错误,希望能在某些时候修复。

答案 2 :(得分:1)

以下是一个示例,如何将新文件保存到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();
            }
        }

    }

答案 3 :(得分:-1)

使用JFileChooser,但将其放在程序的开头:

    try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (Exception e) {
        e.printStackTrace();
    }