2010-11-20 8 views
5

स्विंग पेशेवरों को नमस्कार, यहां आपके लिए एक अच्छा (मुझे आशा है) प्रश्न है।JFileChooser व्यवहार को बदलना: फ़ाइल पथ में प्रवेश पर "चुनना" को रोकना JTextField

नीचे दिए गए कार्य आवश्यकताओं और संभावित समाधान हैं। मैं चाहता हूं कि इस बारे में कुछ विचार साझा करने के लिए किसी को इतना कट्टर अनुभव हो।

यह कोडिंग या ऐसा कुछ की आवश्यकता नहीं है, मैं सिर्फ सामान्य सलाह की जरूरत के रूप में जो करने के लिए दृष्टिकोण तथ्य मैं निजी प्रतीकों जो sun.swing और/में रहते हैं के साथ काम करने की जरूरत के बारे में और अधिक विश्वसनीय है या javax.swing.plaf संकुल।

कार्य JFileChooser व्यवहार को संशोधित/परिवर्तित करना है (वास्तव में थोड़ा सा, वास्तव में)।

  1. जब उपयोगकर्ता प्रेस फ़ाइल नाम JTextField में दर्ज करें, और क्षेत्र एक निर्देशिका करने के लिए एक पथ है, dir नहीं "का चयन करें" है, लेकिन बजाय इसे करने के लिए स्विच। हां, संवाद निर्देशिका को स्वीकार करने के लिए कॉन्फ़िगर किया गया है, लेकिन हमें फ़ाइल सूची तालिका में केवल "ओपन" बटन पर क्लिक करके, और संभवतः डबल-क्लिक स्वीकार करने की आवश्यकता है।

    एक:

  2. फ़ाइल नाम पाठ क्षेत्र

सामान्य समाधान विकल्पों में से Here're जोड़ी में प्रवेश से टकराने के माध्यम से 1GB डेटा की तुलना में अधिक के साथ एक dir/फ़ाइल का चयन से उपयोगकर्ता को रोकने के। संपत्ति-आधारित परिवर्तनों को सुनें जो JFileChooser प्रदान करता है (जो AFAICS तथ्य के बाद ट्रिगर होते हैं और हमें यहां आवश्यक नियंत्रण की डिग्री प्रदान नहीं करेंगे)।

बी। javax.swing.plaf.basic.BasicFileChooserUI साथ टिंकर (refrection के माध्यम से, निजी स्तर की कैप्सूलीकरण तोड़ने) और

private Action approveSelectionAction = new ApproveSelectionAction(); 
ताकि हमारे कस्टम क्रिया 1 और 2. इस के लिए अतिरिक्त चेकों करता

के संदर्भ में परिवर्तन प्लेफ पैकेज के साथ लिंक से संपर्क करें और इस यूआई क्लास के नीचे कुछ वर्ग में इस क्रिया को किसी तरह से ओवरराइड किया जा सकता है।

सी। JFileChooser घटक पदानुक्रम को पार करें, JTextField (जो स्पष्ट रूप से घटक पेड़ में केवल एक बार होना चाहिए) को ढूंढें, हमारे कस्टम चेक के साथ उस JTextField पर लटकने वाले सभी एक्शन श्रोताओं को सजाने के लिए। मेरा डिबगिंग सत्र दिखाता है कि यह JTextField sun.swing.FilePane में रहने वाले JTextField का कुछ अज्ञात सबक्लास है। यह दृष्टिकोण अधिक ओओ-फ्रेंडली प्रतीत होता है, लेकिन एक मौका है कि कुछ ओएस के लिए यह टेक्स्ट फ़ील्ड अनुपस्थित है, या कुछ अन्य JTextField पदानुक्रम में भी मौजूद है।

ठीक है, ऐसा लगता है कि सार्वजनिक JFileChooser API उस व्यवहार को प्राप्त करने के लिए पर्याप्त नहीं होगा, जबकि अन्य दो विकल्प या तो गहरे जादू या अयोग्य (दीर्घकालिक) या यहां तक ​​कि दोनों भी हैं।

तो सवाल यह है कि आप किस दृष्टिकोण का चयन करेंगे और क्यों?

उत्तर

5

विकल्प 2 के संबंध में, आपको स्वीकृति कार्रवाई को अनुकूलित करने के लिए प्रतिबिंब का उपयोग करने की आवश्यकता नहीं है। आप केवल स्वीकृति चयन() विधि को ओवरराइड कर सकते हैं। कुछ ऐसा:

JFileChooser chooser = new JFileChooser(new File(".")) 
{ 
    public void approveSelection() 
    { 
     if (getSelectedFile().exists()) 
     { 
      System.out.println("duplicate"); 
      return; 
     } 
     else 
      super.approveSelection(); 
    } 
}; 
+0

ओह मुझे डंबो, मैं इसका परीक्षण करूंगा और अपने निष्कर्षों के साथ रिपोर्ट करूंगा। –

+0

वैसे हाँ, मैं कुछ मामलों में super.approveSelection() को कॉल न करके चयन ईवेंट को स्वीकृति देने और अक्षम करने में काफी सक्षम था जिसे अमान्य माना जाना चाहिए था। यह काफी अच्छा समाधान था, धन्यवाद। –

3

मुझे हाल ही में एक ही आवश्यकता का सामना करना पड़ा, यानी।, JFileChooser के JTextField में एंटर दबाकर संवाद से संवाद करने के बजाय प्रदर्शित संवाद को निर्देशिका को पार करने का कारण बनना चाहिए। केवल ओपन बटन पर क्लिक करने से अंतिम चयन होना चाहिए।

समाधान काफी सरल था (कम से कम मेरे आवेदन के लिए) और इसमें दो घटक हैं (मैसेड अप फॉर्मेटिंग क्षमा करें। मैं इस मंच पर नया हूं और मुझे यकीन नहीं है कि कोड सही तरीके से क्यों प्रदर्शित नहीं हो रहा है) ।

1 - एक AWTListener रजिस्टर

class MyChooser extends JFileChooser implements java.awt.AWTEventListener { 

    ... 
    MyChooser(){ 
     Toolkit.getDefaultToolkit().addAWTEventListener(this, 
     AWTEvent.MOUSE_EVENT_MASK + AWTEvent.KEY_EVENT_MASK); 
     ... 

    } 

    int lastEventId; 

    public void eventDispatched(AWTEvent e) { 
     lastEventId=e.getID(); 
    } 
} 

2 उपयोगकर्ता द्वारा उत्पन्न पिछले घटना प्रकार का ट्रैक रखने के - JFileChooser की विधि approveSelection() ओवरराइड और क्या स्वीकृति अनुरोध की जांच एक माउस का परिणाम है घटना (संभवतः उपयोगकर्ता द्वारा ओपन बटन पर क्लिक करने के कारण) या एंटर दबाकर उपयोगकर्ता द्वारा की जाने वाली एक महत्वपूर्ण घटना। 'LastEventId' चर इस जानकारी तक पहुंच प्रदान करता है। मेरा स्वयं का अनुमोदन चयन निम्नानुसार दिखता है:

public void approveSelection() { 
    File f=getSelectedFile(); 
    if (f.exists() && isTraversable(f) && lastEventId == 
     KeyEvent.KEY_PRESSED) { 
     setCurrentDirectory(f); 
     return; 
    } 
    super.approveSelection(); } 
+0

खूबसूरती से काम करता है। माउस-ओफोबिक के रूप में डिफ़ॉल्ट कार्यक्षमता वास्तव में मुझे परेशान कर रही थी, और मुझे डर था कि समाधान ढूंढना मुश्किल होगा। –

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