2012-08-29 9 views
7

मैंने सूची चयन चयनकर्ता को लागू किया है जैसा कि आप नीचे देख सकते हैं, ताकि पहली तालिका में किसी विशिष्ट पंक्ति को चुना जा रहा हो, तो दूसरी तालिका तदनुसार अपडेट हो जाती है।कीबोर्ड सूची के साथ जावा सूची चयन चयनकर्ता इंटरफ़ेस

class SelectionListener implements ListSelectionListener { 

    public SelectionListener(){} 

    @Override 
    public void valueChanged(ListSelectionEvent e) 
    { 
     if (e.getSource() == myTrumpsAndMessages.jTable1.getSelectionModel() 
      && myTrumpsAndMessages.jTable1.getRowSelectionAllowed() 
      && e.getValueIsAdjusting()) 
     { 
      int selected = myTrumpsAndMessages.jTable1.getSelectedRow(); 
      clearjTable(jTable4); 
      showSubscribers(selected); 
     } 
    } 

} 

वहाँ श्रोता न केवल जब माउस को चुनने है आह्वान करने के लिए एक रास्ता है, लेकिन यह भी जब चुनाव कीबोर्ड से बनाया जा रहा है?

+0

स्मृति से, जब तक उपयोगकर्ता स्थान दबाता है या दर्ज नहीं करता है तब तक चयन नहीं बदला जा सकता है - परीक्षण नहीं किया गया है, बस मेरी सुबह की मेमोरी को बंद कर रहा है - इसका मतलब यह होगा कि चयन चयन घटनाओं को तब तक नहीं मिलेगा जब तक कि – MadProgrammer

+0

श्रोता को जब भी चयन किया जाता है तब भी आमंत्रित किया जाता है बदल गया, परिवर्तन के लिए निम्न-स्तरीय ट्रिगर से स्वतंत्र (माउस, कीबोर्ड, प्रोग्रामेटिक, जॉयस्टिक ..) यदि यह आपके कोड में काम नहीं कर रहा है, तो उस हिस्से में कुछ गलत है जो आप नहीं दिखा रहे हैं। बीटीडब्लू: वास्तव में सामान – kleopatra

+1

@ क्लोपेट्रा करने से पहले getValueIsAdjusting संपत्ति को देखना न भूलें, चेक किया गया है (अगर कथन में अंतिम स्थिति), लेकिन चेक अन्य सभी श्रोताओं में अलग है और समस्या की व्याख्या कर सकता है। मैंने इस टिप्पणी को मेरे उत्तर में – Robin

उत्तर

7

असामान्य अनुभव के लिए कारण - - कुंजीपटल के माध्यम से चयन पर कोई सूचना कुंजीपटल बनाम माउस ट्रिगर चयन की घटनाओं के लिए valueIsAdjusting का एक सूक्ष्म अलग सेटिंग है:

  • कीबोर्ड चयन (यहां तक ​​कि संशोधक के साथ) शुरू हो रहा केवल एक बार आग (समायोजन के साथ == गलत)
  • माउस शुरू हो रहा चयन हमेशा दो बार आग (प्रथम, सच दूसरे झूठे के साथ साथ)

तथ्य असामान्य तर्क (जो @Robin देखा, +1 उसे साथ संयुक्त यही कारण है कि :-)

if (e.getSource() == myTrumpsAndMessages.jTable1.getSelectionModel() 
     && myTrumpsAndMessages.jTable1.getRowSelectionAllowed() 
     // typo/misunderstanding or feature? doing stuff only when adjusting 
     && e.getValueIsAdjusting()) 

(प्रतिक्रिया केवल तभी चयन है को व्यवस्थित) नहीं देख करने के लिए कीबोर्ड बदलाव शुरू होता है।

+0

+1 क्यों बेहतर स्पष्टीकरण के लिए। मैंने केवल यह माना कि समस्या का कारण बन रहा था, अब मुझे यह भी पता है कि क्यों – Robin

+1

धन्यवाद, मैं & e egetValueIsAdjusting() == झूठी में बदल गया और यह समस्या हल हो गई। – Onca

1

मैंने अभी ListSelectionListener की कोशिश की है और valueChanged() ईवेंट वास्तव में कीबोर्ड चयन परिवर्तन पर ट्रिगर किया जा रहा है।

list.addListSelectionListener(new ListSelectionListener() { 
    public void valueChanged(ListSelectionEvent e) { 
    System.out.println(list.getSelectedValue()); 
    } 
}); 
+0

बेशक, ऐसा इसलिए है क्योंकि आपने यह जांच नहीं की है कि e.getValueIsAdjusting()) == सत्य। जब आप इसे छोड़ देते हैं, तो हर घटना दो बार हो रही है। – Onca

+1

@ ओन्का आप शायद 'e.getValueIsAdjusting() == false' के बजाय' सत्य 'की जांच करना चाहते हैं। मेरा उत्तर देखें – Robin

+0

आप सही हैं। धन्यवाद। असामान्य तर्क को खोजने के लिए – Onca

5

वहाँ श्रोता न केवल जब माउस को चुनने है आह्वान करने के लिए एक रास्ता है, लेकिन यह भी पसंद कीबोर्ड से किया जा रहा है जब: नीचे मेरी उदाहरण देखें?

श्रोता चयन परिवर्तन के स्रोत से स्वतंत्र, ट्रिगर किया जाएगा। तो हाँ, यह पूरी तरह से संभव है और यहां तक ​​कि डिफ़ॉल्ट व्यवहार भी है। तो इस काम को पाने के लिए कुछ खास नहीं किया जाना चाहिए। अपने श्रोता की कोड पर

देखते हुए, मैं करने के लिए

class SelectionListener implements ListSelectionListener { 
    public SelectionListener(){} 
    @Override 
    public void valueChanged(ListSelectionEvent e){ 
    if (e.getValueIsAdjusting()){ 
     return; 
    } 
    if (e.getSource() == myTrumpsAndMessages.jTable1.getSelectionModel() && 
     myTrumpsAndMessages.jTable1.getRowSelectionAllowed()) { 
     int selected = myTrumpsAndMessages.jTable1.getSelectedRow(); 
     clearjTable(jTable4); 
     showSubscribers(selected); 
    } 
    } 
} 

नोट यह विधि से जल्दी छुट्टी के पुनर्लेखन के लिए जब getValueIsAdjusting() रिटर्न true इस रूप में व्यवहार आप ज्यादातर मामलों में चाहते हैं सुझाव है।

+0

+1 :-) – kleopatra

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