2011-02-28 15 views
8

Bir dosyayı kaydetmek için bir iletişim kutusu oluşturmak için java.awt.FileDialog kullanıyorum. Sorun, önerilen (varsayılan) dosya adını belirttiğimde, FileDialog uzantısını çıkarmasıdır. Örnek:Java içinde FileDialog dosyalarını kaydeder ilk dosya uzantısı

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

Ben FileDialog göründüğünde, varsayılan dosya adı "Untitled.txt" olduğu beklenebilir, ancak bunun yerine sadece "Adsız" dir. Kullanıcılar Kaydet'i tıkladığında, uzantı olmadan bir dosya adı alırım. FileDialog bunu hem Windows hem de OS X üzerinde yapar.

Anlamadım. FileDialog neden kasıtlı olarak uzantıyı soydu? Bunun mantıklı bir nedeni var mı? Belgeler bunu tartışmıyor. Çözüm olarak, ben sadece

(ı JFileChooser kullanamazsınız unutmayın.; ı yerli AWT FileDialog gerekir) ... FileDialog verir, ama yine de bu bir böcek gibi görünüyor dizeye uzantısı ekleyebilir

cevap

2

Bu, Windows 7'de Sun Java 1.5 ve 1.6 ile benim için olmaz.

alıyorum davranış Windows explorer "Bilinen dosya türleri gizle uzantıları" ayarına biraz değişir. Eğer açıksa, beklediğiniz gibi dosya iletişiminde uzantıyı göremiyorum, ancak tam dosya adını döndürür.

DÜZENLEME: AWT ve yerli Widget'larla ilgili yanlış olduğunu Fark - AWT ve Swing kafa karıştırıcı.

+0

İçgörü için teşekkür ederiz. Windows'daki davranışların "Uzantıları gizle" ayarına bağlı olduğu konusunda gerçekten haklısınız. Ve haklısınız, "Uzantıları gizle" açık olsa bile ve kullanıcı uzantıyı açıkça eklemese bile dosya adını uzantıya döndürür. – vocaro

+0

Sorun, Java'nın Mac sürümüne yalıtılmış görünüyor. Mac ayrıca bir "Uzantıları gizle" ayarına sahiptir; Ancak, bu ayar açıksa, uzantı iletişim metin alanına gizlenir, ancak döndürülen dize uzantı İÇERMEZ. Bu açıkça bir çapraz platform hatası, bu yüzden Apple ile bir rapor yazacağım. Yardımın için tekrar teşekkürler. – vocaro

+0

@vocaro Rapor mu kaydettin? Herhangi bir bağlantı var mı? Bu sorunu nasıl çözdünüz? – Igor

2

Sadece Mac'te görünen bu aynı soruna bir yanıt arıyordum. Ya çirkin JFileChooser (salıncak, hafif, doğal olmayan görünüm) seçeneği ile yaşamak ya da bir uzantı (os mac) ve dosya uzantısını kendi kendine ekleyerek farklı şeyler işlemek zorundasınız.

Bir noktada giderilmesi umulur bir Mac Java AWT hatasıdır.

-1

Kullanım JFileChooser ancak programın başında koymak: Burada

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

, belirtilen dizin ve FileDialog dosyanın adının bir vektör alınan dizeleri yeni bir dosya kaydetmek için nasıl bir örnektir Strings. Benim için çalışıyor!

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

    }