2011-02-28 89 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(); 
      } 
     } 

    }