2010-09-29 16 views
8

पर ईवेंट पास करना मैं एक ऐप बनाना चाहता हूं जहां कुछ घटनाओं को संभाला जाना चाहिए जैसे कि वे मूल कंटेनरों को पहुंचे। उदाहरण के लिए मुझे एक जेपीनेल मिला है जिसमें जेएलएबल है। शीर्ष जेपीनेल माउसप्रेस लागू करता है और अभी खींच रहा है। घटनाओं को देखने के लिए मुझे लेबल करने की बजाय जेपीनल पहुंचने के लिए मुझे क्या करने की ज़रूरत है। (स्रोत ऑब्जेक्ट बदलना महत्वपूर्ण है)पेरेंट

क्या वास्तव में घटनाओं को लागू करने और माता-पिता में उन्हें दोहराने से कुछ बेहतर समाधान है? (यह कुछ वस्तुओं के बाद> 5 बच्चों के साथ थकाऊ हो जाएगा)।

+0

क्यों आप इस (उदाहरण) करने की आवश्यकता है? – Pete

+0

मेरे पास कई लेबलों के साथ ऑब्जेक्ट्स हैं, जो वास्तव में पहली बार क्लिक किए जाने पर ड्रैगगेबल होना चाहिए। अभी वे केवल तब खींच सकते हैं जब मैं तत्व की पृष्ठभूमि पर क्लिक करता हूं, अंदर कोई लेबल नहीं। – viraptor

उत्तर

10

अपने ईवेंट श्रोता पर, आप ईवेंट को मूल घटक में प्रेषित कर सकते हैं।

myEvent होने के नाते घटना समारोह तर्क से निपटने:

Component source=(Component)myEvent.getSource(); 
source.getParent().dispatchEvent(myEvent); 

लेकिन यह समाधान प्रत्येक तत्व जोड़ने के लिए के लिए एक नया EventListener बनाने निकलता है।

तो, आप एक ही ईवेंट हैंडलर बना सकते हैं और इसे पुन: उपयोग, सभी चुने हुए बच्चों में जोड़ने से इस तरह:

final Container parent=this; //we are a the parent container creation code 
MouseListener myCommonListener=new MouseListener() { 
    @Override 
    public void mouseClicked(MouseEvent e) { 
     parent.dispatchEvent(e); 
    } 
    @Override 
    public void mouseEntered(MouseEvent e) { 
     parent.dispatchEvent(e); 
    } 
    @Override 
    public void mouseExited(MouseEvent e) { 
     parent.dispatchEvent(e); 
    } 
    @Override 
    public void mousePressed(MouseEvent e) { 
     parent.dispatchEvent(e); 
    } 
    @Override 
    public void mouseReleased(MouseEvent e) { 
     parent.dispatchEvent(e); 
    } 
}; 

JLabel label=new JLabel("This is the first Label"); 
label.addMouseListener(myCommonListener); 

JLabel label2=new JLabel("This is the second Label"); 
label2.addMouseListener(myCommonListener); 
//... and so on 
+0

इसने थ्रेड थ्रेड में एक स्टैक ओवरफ़्लो बनाया (क्योंकि माता-पिता घटना को वापस बच्चे के नियंत्रण में पास कर रहा था)। इस समस्या को हल करने के बारे में कोई विचार? मैं अभिभावक वर्ग को संपादित नहीं कर सकता, फिर भी मुझे घटना प्राप्त करने की आवश्यकता है, लेकिन इस घटना पर कार्य करने से रोकें कि माता-पिता मेरे नियंत्रण में वापस आ जाएंगे। – ed22

+0

संसाधन-वार यह एक बुरा विचार है। आप कुछ भी नहीं के लिए बहुत अधिक ओवरहेड जोड़ रहे हैं। बाल तत्वों पर माउस श्रोताओं को हटाने के लिए यह और अधिक कुशल है। आप इसके जवाब को फिर से करने के तरीके के बारे में देख सकते हैं। – qwertzguy

2

आप माता-पिता के लिए यह भेजने से पहले घटना को परिवर्तित करना चाहिए। रूपांतरण में अभिभावक-रिश्तेदार को निर्देशांक निर्देशांक शामिल हैं।

public class RedispatchingMouseAdapter implements MouseListener, MouseWheelListener, MouseMotionListener{ 

    public void mouseClicked(MouseEvent e) { 
     redispatchToParent(e); 
    } 

    public void mousePressed(MouseEvent e) { 
     redispatchToParent(e); 
    } 

    public void mouseReleased(MouseEvent e) { 
     redispatchToParent(e); 
    } 

    public void mouseEntered(MouseEvent e) { 
     redispatchToParent(e); 
    } 

    public void mouseExited(MouseEvent e) { 
     redispatchToParent(e); 
    } 

    public void mouseWheelMoved(MouseWheelEvent e){ 
     redispatchToParent(e); 
    } 

    public void mouseDragged(MouseEvent e){ 
     redispatchToParent(e); 
    } 

    public void mouseMoved(MouseEvent e) { 
     redispatchToParent(e); 
    } 

    private void redispatchToParent(MouseEvent e){ 
     Component source = (Component) e.getSource(); 
     MouseEvent parentEvent = SwingUtilities.convertMouseEvent(source, e, source.getParent()); 
     source.getParent().dispatchEvent(parentEvent); 
    } 
} 
+0

आपका उत्तर वास्तव में टॉमस नारोस के उत्तर पर एक टिप्पणी है। – SeniorJD

+0

@SeniorJD यह एक बिल्कुल वैध जवाब है। यह बस दूसरे जवाब पर बनाता है और अपने आप खड़े हो सकते हैं। यह बेहतर होगा अगर वोजटेक थोड़ा और वर्णन करेगी कि इस समायोजन की आवश्यकता क्यों है। –

+0

संसाधन-वार यह एक बुरा विचार है। आप कुछ भी नहीं के लिए बहुत अधिक ओवरहेड जोड़ रहे हैं। बाल तत्वों पर माउस श्रोताओं को हटाने के लिए यह और अधिक कुशल है। आप इसके जवाब को फिर से करने के तरीके के बारे में देख सकते हैं। – qwertzguy

-1

माउस ईवेंट अपने आप गहरी घटक माउस श्रोताओं है कि करने के लिए लक्षित कर रहे हैं।

इसके कारण, अपना लक्ष्य प्राप्त करने के लिए, आप बस जेएलएबल पर सभी माउस श्रोताओं को हटा सकते हैं और इसे कभी भी माउस ईवेंट के लिए लक्ष्य के रूप में नहीं चुना जाएगा।

निम्नलिखित कोड दिया घटकों और उनके बच्चों रिकर्सिवली पर माउस श्रोताओं को निष्क्रिय कर देगा:

private void disableMouseForComponent(Component... components) { 
    for (Component c : components) { 
     if (c instanceof Container) { 
      disableMouseForComponent(((Container) c).getComponents()); 
     } 
     for (MouseListener l : c.getMouseListeners()) { 
      c.removeMouseListener(l); 
     } 
     for (MouseMotionListener l : c.getMouseMotionListeners()) { 
      c.removeMouseMotionListener(l); 
     } 
    } 
} 
+0

व्यक्ति जो -1 वर्षीय है: क्या आप समझाने की परवाह करते हैं क्यों? माता-पिता को भेजे गए श्रोता को जोड़ने से इस तरह से ऐसा करना बेहतर संसाधन है। – qwertzguy

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