我正在使用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。)
答案 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();
}