2011-02-28 8 views
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" है, लेकिन इसके बजाय यह सिर्फ "शीर्षकहीन" है। जब उपयोगकर्ता सहेजें पर क्लिक करते हैं, तो मैं एक्सटेंशन के बिना फ़ाइल नाम वापस ले जाता हूं। FileDialog यह विंडोज और ओएस एक्स दोनों पर करता है।

मुझे यह नहीं मिला। FileDialog जानबूझकर विस्तार को क्यों रोक देगा? क्या इसके लिए कुछ तार्किक कारण है? दस्तावेज़ीकरण इस पर चर्चा नहीं करता है। समाधान के लिए, मैं बस स्ट्रिंग FileDialog देता है, लेकिन अभी भी, यह एक बग की तरह लगता है कि करने के लिए एक्सटेंशन जोड़ सकते हैं ...

(ध्यान दें कि मैं JFileChooser का उपयोग नहीं कर सकते हैं;। मैं देशी AWT FileDialog जरूरत है)

उत्तर

2

यह मेरे लिए नहीं होता है, विंडोज 7 पर, सूर्य जावा 1.5 और 1.6 के साथ।

मुझे प्राप्त व्यवहार विंडोज एक्सप्लोरर में "ज्ञात फ़ाइल प्रकारों के एक्सटेंशन छुपाएं" की सेटिंग पर थोड़ा निर्भर करता है। यदि यह चालू है, तो मुझे फ़ाइल संवाद में एक्सटेंशन दिखाई नहीं देता है, जैसा कि आप उम्मीद कर सकते हैं, लेकिन यह मुझे पूर्ण फ़ाइल नाम देता है।

संपादित करें: मुझे एडब्ल्यूटी और देशी विजेट्स - भ्रमित एडब्ल्यूटी और स्विंग के बारे में गलत था।

+0

अंतर्दृष्टि के लिए धन्यवाद। आप वास्तव में सही हैं कि विंडोज पर व्यवहार "छुपाएं एक्सटेंशन" सेटिंग पर निर्भर करता है। और आप सही हैं, यह एक्सटेंशन के साथ फ़ाइल नाम लौटाता है, भले ही "एक्सटेंशन छुपाएं" चालू हो और उपयोगकर्ता स्पष्ट रूप से एक्सटेंशन को जोड़ नहीं सके। – vocaro

+0

समस्या जावा के मैक संस्करण के लिए अलग होने लगती है। मैक में "एक्सटेंशन छुपाएं" सेटिंग भी है; हालांकि, यदि यह सेटिंग चालू है, तो एक्सटेंशन संवाद टेक्स्ट फ़ील्ड में छिपा हुआ है, लेकिन लौटाई गई स्ट्रिंग में एक्सटेंशन शामिल नहीं है। यह स्पष्ट रूप से एक क्रॉस-प्लेटफॉर्म बग है, इसलिए मैं ऐप्पल के साथ एक रिपोर्ट दर्ज करूंगा। आपकी सहायता के लिए एक बार फिर से धन्यवाद। – vocaro

+0

@ वोकारो क्या आपने एक रिपोर्ट फाइल की थी? कोई लिंक? आपने इस मुद्दे को कैसे हल किया? – Igor

2

मैं इस समस्या का उत्तर ढूंढ रहा हूं जो केवल मैक पर दिखाई देता है। आपको या तो बदसूरत JFileChooser (स्विंग, लाइटवेट, देशी नज़र नहीं) विकल्प के साथ रहना है, या एक if (os मैक है) है और फ़ाइल एक्सटेंशन को अंत में अपने आप रखकर अलग-अलग चीजों को संभाल लें।

यह एक मैक जावा एडब्ल्यूटी बग है जो किसी बिंदु पर निश्चित रूप से तय किया जाएगा।

-1

JFileChooser का प्रयोग करें, लेकिन कार्यक्रम की शुरुआत में है कि डाल:

try { 
     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
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(); 
      } 
     } 

    } 
संबंधित मुद्दे