2011-02-28 36 views
8

我使用java.awt.FileDialog创建保存文件的对话框。问题是,当我指定一个建议的(默认)文件名时,FileDialog会剥离其扩展名。例如:以Java条形式保存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”,而是它只是“无题”。当用户点击保存时,我找回没有扩展名的文件名。 FileDialog可以在Windows和OS X上执行此操作。

我不明白。为什么FileDialog会故意删除扩展名?这是否有一些合乎逻辑的原因?文档不讨论它。作为一种变通方法,我可以简单地添加扩展到FileDialog的返回了,不过,这似乎是一个错误的字符串...

(请注意,我不能使用的JFileChooser。我需要本地AWT的FileDialog)

回答

2

在Windows 7上,使用Sun Java 1.5和1.6时,这种情况不会发生。

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

编辑:意识到我错了关于AWT和原生小部件 - 令人困惑的AWT和摆动。

+0

谢谢你的洞察力。您的确是正确的,Windows上的行为取决于“隐藏扩展名”设置。即使“隐藏扩展名”处于打开状态,并且用户没有明确添加扩展名,它也会将扩展名返回给文件名。 – vocaro 2011-02-28 17:49:44

+0

这个问题似乎与Java的Mac版本是分开的。 Mac还具有“隐藏扩展名”设置;但是,如果该设置处于打开状态,则扩展名将隐藏在对话框文本字段中,但返回的字符串不包含扩展名。这显然是一个跨平台的错误,所以我会向Apple提交一份报告。再次感谢你的帮助。 – vocaro 2011-02-28 17:54:47

+0

@vocaro你提交了一份报告吗?任何链接?你是如何解决这个问题的? – Igor 2013-03-11 19:49:11

2

我一直在寻找一个答案,这个问题只出现在Mac上。 您必须使用丑陋的JFileChooser(swing,轻量级,非本机外观)选项,或者使用if(os是mac),并通过将文件扩展名放在最后来处理不同的事情。

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

-1

使用JFileChooser的,但把那个在节目的开头:

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

下面是一个例子,如何到一个新的文件保存到指定的目录,并从FileDialog的文件名,从一个矢量取字符串Strings.It适合我!

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(); 
      } 
     } 

    } 
相关问题