2010-04-28 21 views
6

क्या कोई पूर्ववर्ती वर्ग है जो EventListener संचालन को जोड़ने/निकालने में सहायता करता है? (प्रॉपर्टीChangeSupport की तरह)स्विंग: ईवेंट श्रोता समर्थन वर्ग

मैं अपने कोड को मॉडल में विभाजित करने और जावा में देखने की कोशिश कर रहा हूं। मेरे पास कुछ डेटा है जो गलत तरीके से आता है, और मॉडल को किसी प्रकार के इवेंट लिस्टनर का समर्थन करना चाहेगा ताकि एक मॉडल मॉडल में बदलावों की सदस्यता ले सके। डेटा असंख्य + जटिल है कि मैं पूरी तरह से जुड़ा हुआ जवाबीन्स संपत्ति परिवर्तन समर्थन नहीं करना चाहता; बल्कि मैं अधिसूचना की अनुमति देना चाहूंगा कि मॉडल एक मोटे रास्ते में बदल गया है।

मैं यह कैसे कर सकता हूं?

उत्तर

9

मैं एक ChangeEvent साथ कि संभाल होगा। यह सिर्फ एक संकेत है कि कुछ बदल गया है।

ऐड/निकालें/अग्नि कार्यक्षमता को लागू करने के लिए। PropertyChangeSupport जैसी कोई व्यवस्था नहीं है, लेकिन कोड इतना आसान है कि इसकी वास्तव में आवश्यकता नहीं है।

private final EventListenerList listenerList = new EventListenerList(); 
private final ChangeEvent stateChangeEvent = new ChangeEvent(this); 

public void addChangeListener(ChangeListener l) { 
    listenerList.add(ChangeListener.class, l); 
} 
public void removeChangeListener(ChangeListener l) { 
    listenerList.remove(ChangeListener.class, l); 
} 
protected void fireChange() { 
    for (ChangeListener l: listenerList.getListeners(ChangeListener.class)) { 
     l.stateChanged(stateChangeEvent); 
    } 
} 

नोट: JComponent उप-वर्गों द्वारा उपयोग के लिए एक संरक्षित listenerList वस्तु प्रदान करता है।

+0

महान, धन्यवाद! –

+0

हाँ, 'चेंजएवेंट' एक असली राज्य परिवर्तन घटना है। 'PropertyChangeEvent' सिर्फ गलत है, और आईआईआरसी गलत स्विंग में लागू किया गया है। यह शायद एक ऐसे ईवेंट मॉडल में जाने के लिए बहुत अधिक है जिसमें उस व्यर्थ घटना ईवेंट नहीं है। :((ओह, और @ डेवन, विषम 'अंतिम' वहां मिस नहीं जाएंगे।) –

+0

@ पकड़ने के लिए धन्यवाद। –

1

मुझे यकीन नहीं है कि यह आपके प्रश्न का उत्तर देता है, लेकिन आप javax.swing.event.EventListenerList का उपयोग कर सकते हैं, यह आपके श्रोताओं के लिए add() और निकालें() संचालन का समर्थन करता है। तो फिर तुम घटनाओं आग एक विशेष श्रोता उपवर्ग से अधिक पुनरावृति कर सकते हैं:

for (MyListener listener : listenerList.getListeners(MyListener.class) { 
    listener.fireEvent(...); 
} 
संबंधित मुद्दे