2009-08-19 14 views
9

क्या कोई मुझे बता सकता है कि कोड का यह टुकड़ा कंसोल पर क्यों प्रिंट करता है जब आप अपने माउस को चेक बॉक्स पर ले जाते हैं? "परिवर्तन" घटना क्या होती है?जेसीकबॉक्स परिवर्तन श्रोता घटनाओं पर माउस की अधिसूचना प्राप्त हो जाती है

import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 


public class Test { 

    public static void main(String[] args) { 
     JFrame f = new JFrame(); 
     JCheckBox c = new JCheckBox("Print HELLO"); 
     c.addChangeListener(new ChangeListener() { 

      @Override 
      public void stateChanged(ChangeEvent e) { 
       System.out.println("HELLO"); 
      } 
     }); 
     f.getContentPane().add(c); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.pack(); 
     f.setVisible(true); 
    } 

} 

नोट: मैं एक कार्रवाई श्रोता का उपयोग नहीं करते क्योंकि मेरे कार्यक्रम में मैं ऐसा करने में सक्षम होना चाहता हूँ:

checkBox.setSelected(boolean) 

और मेरे श्रोता अधिसूचित, एक के साथ नहीं किया जा सकता है जो है कार्रवाई श्रोता। तो क्या इस "माउस ओवर" ईवेंट को अक्षम करने का कोई तरीका है या किसी अन्य तरीके से मैं अपने श्रोता को कार्यान्वित कर सकता हूं?

+0

अजीब, मैंने सोचा कि 'सेट सेलेक्टेड' का उपयोग करके परिवर्तन श्रोताओं को ट्रिगर करेगा। मुझे कुछ और सोचना चाहिए। – jeef3

+0

यदि मै मैक ओएसएक्स पर जावा 5 पर चलाता हूं तो मुझे घटनाओं पर माउस नहीं मिलता है। – banjollity

+0

@ jeef3: सेट चयनित चयन घटनाओं को ट्रिगर करता है। यही कारण है कि मैं इसका उपयोग कर रहा हूँ। बात यह है कि परिवर्तन घटनाओं को गति से माउस द्वारा ट्रिगर किया जाता है :) –

उत्तर

28

आपको माउस पर घटनाएं मिलती हैं क्योंकि प्राप्त/खो गया फोकस घटक की स्थिति में परिवर्तन का प्रतिनिधित्व करता है।

इसके बजाय आप एक आइटम लिस्टनर का उपयोग कर सकते हैं जो आपको आइटम एवेन्ट्स देगा।

ऑब्जेक्ट जो आइटम लिस्टनर इंटरफ़ेस लागू करता है, यह घटना तब होती है जब ईवेंट होता है। श्रोता को अलग-अलग माउस आंदोलनों और माउस क्लिक को संसाधित करने के विवरण से बचाया जाता है, और इसके बजाय "आइटम चयनित" या "आइटम अचयनित" जैसे "अर्थपूर्ण" (अर्थपूर्ण) ईवेंट को संसाधित कर सकता है।

आप इसे सार बॉक्स बटन में addItemListener() विधि के साथ अपने चेकबॉक्स में जोड़ सकते हैं। बस इस के साथ addChangeListener बदल देते हैं:

c.addItemListener(new ItemListener() { 

    public void itemStateChanged(ItemEvent e) { 
     System.err.println(e.getStateChange()); 
    } 
}); 
+0

धन्यवाद यह काम करता है। मैं हमेशा आइटम श्रोताओं को केवल घटकों की तरह सूची में लागू किया जाता है। :) –

+1

कोई समस्या नहीं है। यह वास्तव में ListSelectionListener है जो सूचियों के लिए उपयोग किया जाता है। सूचियों और बटनों के लिए एक अलग इंटरफ़ेस है क्योंकि सूची चयनों को कक्षों की एक श्रृंखला का चयन करने में सहायता करने की आवश्यकता होती है, जिसके लिए एक अलग ईवेंट प्रकार की आवश्यकता होती है। – Aaron

1

चेक बॉक्स की स्थिति (यहां तक ​​कि केवल चेक बॉक्स मॉडल) इस पर निर्भर करता है कि उसके पास माउस है या नहीं। तो एक राज्य परिवर्तन घटना की उम्मीद की जानी चाहिए।

तो, बस यह देखने के लिए जांचें कि चेक बॉक्स किस स्थिति में है और तदनुसार अपडेट करें। "Bloated" घटक इंटरफ़ेस का उपयोग करने के बजाय, सीधे मॉडल के लिए जाना बेहतर है।

6

उपयोग c.setRolloverEnabled(false) `और आप माउस गति के लिए किसी भी घटना नहीं मिलेगा।

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