2010-05-21 9 views
16

मुझे लगता है कि ऐसा करने का एक आसान तरीका होना चाहिए लेकिन मैं इसे समझ नहीं सकता। मेरे पास एक JFileChooser है जो उपयोगकर्ता को निर्देशिका चुनने की अनुमति देता है। मैं उपयोगकर्ता को कुछ संदर्भ देने के लिए निर्देशिकाओं में सभी फाइलों को दिखाना चाहता हूं, लेकिन केवल निर्देशिकाओं को चयन के रूप में स्वीकार किया जाना चाहिए (शायद फ़ाइल चयनित होने पर ओपन बटन अक्षम हो जाएगा)। क्या ऐसा करने का कोई आसान तरीका है?JFileChooser निर्देशिका का चयन करें लेकिन फ़ाइलों को दिखाएं

उत्तर

12

स्वीकृति चयन() विधि को ओवरराइड करें। की तरह कुछ:

JFileChooser chooser = new JFileChooser(new File(".")) 
{ 
    public void approveSelection() 
    { 
     if (getSelectedFile().isFile()) 
     { 
      // beep 
      return; 
     } 
     else 
      super.approveSelection(); 
    } 
}; 
1

AFAIK JFileChooser चयन फ़िल्टरिंग (जिसे चुना जा सकता है) से फ़ाइल फ़िल्टरिंग (जिसे देखा जा सकता है, बहुत विन्यास योग्य) अलग करता है।

चयन छानने के विन्यास अधिक सीमित है, लेकिन AFAIK आप केवल dirs या केवल फाइलों setFileSelectionMode()

-1

साथ चयन किया जाना मुझे लगता है कि सबसे अच्छा समाधान सिर्फ उपयोगकर्ता का चयन करने के लिए या तो एक अनुमति देने के लिए है की अनुमति देने के लिए चुन सकते हैं फ़ाइल या एक निर्देशिका। और यदि उपयोगकर्ता फ़ाइल का चयन करता है तो उस निर्देशिका का उपयोग करें जहां वह फ़ाइल स्थित है।

+0

बल्कि गरीब UX। –

13

देखें setFileSelectionMode()How to Use File Choosers में:

setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY) 

परिशिष्ट: प्रभाव इस FileChooserDemo की uncommenting लाइन 73 से देख जा सकता है, लेकिन यह मंच पर निर्भर हो गया लगता है।

परिशिष्ट: FILES_AND_DIRECTORIES का उपयोग कर रहे हैं, तो उसके अनुसार बटन पाठ बदलने पर विचार:

chooser.setApproveButtonText("Choose directory"); 

प्रभाव के रूप में एल & है एफ निर्भर, प्लेटफार्मों पर DIRECTORIES_ONLY का उपयोग कर कि पहले से ही अपने यूआई आवश्यकताओं को पूरा करने पर विचार:

if (System.getProperty("os.name").startsWith("Mac OS X")) { 
    chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 
} else { 
    chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); 
} 
+0

लेकिन वह फाइलों को छुपाएगा, जो वह नहीं चाहता है। –

+0

@mmyers: यह उपरोक्त उद्धृत उदाहरण में ग्रे में फ़ाइलों को दिखाता है। वाईएमएमवी – trashgod

+0

ट्यूटोरियल कहता है, ऐसा लगता है कि यह लैफ-निर्भर है। –

17

मेरा समाधान कैमिकर और ट्रैशगोड के उत्तरों के बीच एक विलय है:

final JFileChooser chooser = new JFileChooser() { 
      public void approveSelection() { 
       if (getSelectedFile().isFile()) { 
        return; 
       } else 
        super.approveSelection(); 
      } 
    }; 
    chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); 
+1

+1 ऐसा लगता है कि मैं अच्छी कंपनी में हूं! मैंने इस संयुक्त दृष्टिकोण को दर्शाने के लिए अपना उत्तर अपडेट किया। – trashgod

+1

बहुत अच्छा! 'JFileChooser.FILES_AND_DIRECTORIES' ** महत्वपूर्ण ** है! इसके बिना, (जैसा कि 'कैमिकर के जवाब में) समाधान ** बेकार ** है, जैसा कि मैंने परीक्षण किया था। –

2

कुछ उपयोगकर्ताओं के लिए approveSelection ओवरराइड करने का समाधान परेशान हो सकता है।

कभी-कभी, कोई उपयोगकर्ता किसी कारण से किसी फ़ाइल में फ़ाइल पर क्लिक नहीं करेगा (भले ही वह निर्देशिका का चयन करना चाहती है न कि फ़ाइल)। यदि ऐसा होता है, तो उपयोगकर्ता JFileChooser में फंस गया होगा (दयालु-ए) approveSelection विफल हो जाएगा, भले ही वह फ़ाइल को अचयनित करे।

JFileChooser fileChooser = new JFileChooser(); 

fileChooser.setFileSelectionMode(
     JFileChooser.FILES_AND_DIRECTORIES); 

int option = fileChooser.showDialog(null, 
     "Select Directory"); 

if (option == JFileChooser.APPROVE_OPTION) { 
    File f = fileChooser.getSelectedFile(); 
    // if the user accidently click a file, then select the parent directory. 
    if (!f.isDirectory()) { 
     f = f.getParentFile(); 
    } 
    System.out.println("Selected directory for import " + f); 
} 

निर्देशिका का चयन, उपयोगकर्ता मेरी राय में एक बेहतर प्रयोज्य में एक फ़ाइल परिणाम चयनित होने पर भी इस झुंझलाहट से बचने के लिए, यह है कि मुझे क्या करना है।

0

रखें fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY) और उपयोग:

File[] selectedFiles = fileChooser.getSelectedFile().listFiles(); 
संबंधित मुद्दे