2009-08-12 13 views
5

मैं निम्नलिखित व्यवहार (Windows Explorer और के लिए इसी तरह समान गोले) के साथ एक JTable करने के लिए एक स्तंभ जोड़ने के लिए कोशिश कर रहा हूँ पर क्लिक करके * नहीं:एक JTable सेल को संपादन योग्य बनाना - लेकिन * डबल

  • सेल हो सकता है इसे सामान्य रूप से चुनने के लिए एक बार क्लिक किया गया।
  • सेल एक अलग कार्रवाई करने के लिए डबल-क्लिक किया जा सकता है (एक बाहरी कार्यक्रम शुरू।)
  • सेल मूल्य (एक स्ट्रिंग) अभी भी संपादित किया जा सकता द्वारा एकल क्लिक करने (एक विराम के बाद) दूसरी बार या जब सेल हाइलाइट किया जाता है तो F2 दबाकर।

डबल क्लिक करना होगा सेल की नहीं ट्रिगर संपादन, लेकिन मैं यदि संभव हो तो किसी अन्य डिफ़ॉल्ट संपादन परिचालन से चलाता छोड़ने के लिए चाहते हैं।

मैं कोशिश की है जोड़ने की मेज, और उपभोक्ता सभी MouseEvent है, लेकिन यह काम नहीं करता करने के लिए एक MouseListener - अगर मैं isCellEditable() से true लौट फिर मेरे श्रोता कभी नहीं किसी भी क्लिक घटनाओं प्राप्त करता है लेकिन अगर मैं वापस जाने के false तो F2 नहीं लंबा काम करता है।

क्या यह केवल ईवेंट श्रोताओं का उपयोग करके हासिल किया जा सकता है? अगर मैं इससे बच सकता हूं तो मैं पीएलएफ़ कार्यों के साथ गड़बड़ नहीं करना चाहूंगा।

+0

[यहां] (http://stackoverflow.com/a/25919008/738017) [कैमिकर] द्वारा एक और हालिया जवाब है (http://stackoverflow.com/users/131872/camickr) जो कोड की 4 पंक्तियों में समस्या को हल करता है। –

उत्तर

3

आप अपने एक भी क्लिक करें और अपने पर तो एक चयनित अपनी खुद की cellEditor बनाने के लिए और ovveride

public boolean isCellEditable(EventObject e) 

आप eventObject

पर clickCount साथ सिंगल और डबल क्लिक बीच भेद कर सकते करना होगा सेल आप सच लौट सकते हैं अन्यथा झूठी वापसी;

आप जोड़ सकते हैं कस्टम inputMap एन actionMap प्रविष्टियां

similar too 
table.getInputMap().put(KeyStroke.getKeyStroke("DOWN"), "doMyArrowDown"); 
table.getTable().getActionMap().put("doMyArrowDown", new ArrowDownAction()); 

और अपनी कार्रवाई से आप तो अपने आप को cellediting

table.editCellAt(row, column); 
सक्रिय कर सकता है F2 सक्षम करने के लिए

int row = ((JTable) e.getSource()).rowAtPoint(e.getPoint()); 
int column = ((JTable) e.getSource()).columnAtPoint(e.getPoint()); 

साथ पंक्ति और स्तंभ को पुनः प्राप्त

+0

यह प्रॉक्सी के साथ मैंने जो किया उसके समान है। मैं केवल ओवरराइड isCellEditable है। कुंजी स्ट्रोक हैंडलर को डिफ़ॉल्ट संपादक में शामिल किया गया है। मुझे इसे फिर से लागू करने की आवश्यकता नहीं है। – finnw

4

डिफ़ॉल्टCellEditor के संपादन के लिए माउस क्लिक को नियंत्रित करने के लिए setClickCountToStart() विधि है। डिफ़ॉल्ट है 2. इसे बदलने से F2 कार्यक्षमता पर कोई प्रभाव नहीं पड़ेगा।

इसलिए आप एक तिहाई क्लिक होने के लिए संपादन सेट कर सकते हैं।

संपादन शुरू करने के लिए दो सिंगल क्लिक को कैसे संभालना है, लेकिन मुझे लगता है कि आप पहले क्लिक का ट्रैक रखने के लिए टाइमर का उपयोग करेंगे और फिर संपादन करें यदि दूसरा एकल क्लिक आपके अंतराल के भीतर है।

+0

टाइमर की कोई आवश्यकता नहीं - इसे डबल क्लिक के रूप में पंजीकरण करने में बहुत धीमी गति की आवश्यकता है। – finnw

1

मैं एक Proxy के साथ मौजूदा CellEditor लपेटकर और isCellEditable के लिए कॉल में अवरोध उत्पन्न कर, सभी माउस की घटनाओं के लिए झूठी लौटने और मूल CellEditor को अन्य सभी कॉल सौंपने के द्वारा इस का समाधान कर लिया।

यह कैमिकर के समाधान से थोड़ा अधिक जटिल है लेकिन सभी संपादकों के लिए काम करता है (मेरे पास 4 है।)

+0

मुझे समाधान देखने में दिलचस्पी होगी। साथ ही, मुझे समझ में नहीं आता कि आप सेल पर प्रारंभिक क्लिक और संपादन शुरू करने के लिए क्लिक के बीच अंतर कैसे करते हैं। क्या आपका कोड केवल अंतिम सेल को ट्रैक करता है जिसे चुना गया था और जब आपको उसी सेल पर दो सिंगल क्लिक मिलते हैं तो आप संपादन शुरू करते हैं? यदि ऐसा है तो दूसरा क्लिक दूसरे या मिनट बाद हो सकता है। आपकी प्रारंभिक आवश्यकता ने "रोकें" के बाद कहा, यही कारण है कि मैंने टिमर को विराम अंतराल को नियंत्रित करने का सुझाव दिया। – camickr

+0

@carnickr, मैंने अभी तक उस हिस्से को लागू नहीं किया है, लेकिन हां यह सही लगता है। कोई सीमा नहीं है। – finnw

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