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

在 Windows 7 和 Sun Java 1.5 和 1.6 上,这不会发生在我身上。

我得到的行为稍微取决于 Windows 资源管理器中“隐藏已知文件类型的扩展名”的设置。如果打开,那么我在文件对话框中看不到扩展名,正如您所料,但它确实返回了完整的文件名。

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

于 2011-02-28T16:26:31.403 回答
2

我一直在寻找仅在 Mac 上出现的同样问题的答案。您要么必须忍受丑陋的 JFileChooser(摇摆、轻量级、非原生外观)选项,要么拥有 if(os 是 mac)并通过自己将文件扩展名放在末尾来以不同方式处理事情。

这是一个 Mac Java AWT 错误,有望在某个时候得到修复。

于 2011-09-22T16:26:58.207 回答
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 回答
-1

使用 JFileChooser,但把它放在程序的开头:

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