2010-06-08 21 views
12

पर क्लिक को संभालने का तरीका क्या है, एक बेवकूफ सवाल हो सकता है, लेकिन जीडब्ल्यूटी फ्लोपेनल (कच्चे div तत्व) माउसक्लिक/मूसमोवमेंट को संभालने के लिए कुछ प्रदान नहीं करता है। ओवरराइडिंग onBrowserEvent या तो काम नहीं करता है।जीडब्ल्यूटी: जीडब्ल्यूटी फ्लोपेनल

यदि मूल जावास्क्रिप्ट का उपयोग करते हुए onclick ईवेंट सेट करना है, तो पहले सकारात्मक ऊंचाई निर्दिष्ट करने की आवश्यकता है, 'div' की ऊंचाई 0 की ऊंचाई है), तो इन घटनाओं को पकड़ना ठीक से काम कर रहा है। क्या JSNI का उपयोग किए बिना ऐसा करने का कोई तरीका है?

उत्तर

18

आपको यहां क्या करना है फोकसैनल को फोकसपैनल में लपेटना है। एक फोकसपैनल में सभी संभावित हैंडलर होते हैं और इस प्रकार आपको एक क्लिकहैंडलर सेट करने में सक्षम बनाता है।

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

मैं व्यक्तिगत रूप से पहली विधि की सिफारिश करता हूं। यह कोड के लिए आसान, तेज़ है और आपके एप्लिकेशन को धीमा नहीं करेगा।

0

लगता है प्रश्न एक गूंगा है, हाँ। FlowPanel आसानी से लपेटा जा सकता है या FocusPanel के साथ प्रतिस्थापित किया जा सकता है, जो घटनाओं की निगरानी/संचालन के लिए बहुत सी विधि प्रदान करता है।

+0

ठीक है, अगर मैं FlowPanel को समझने और फोकसपैनल सही ढंग से, आप फोकसैनेल द्वारा फ़्लोपेनल को प्रतिस्थापित नहीं कर सकते हैं, लेकिन आप निश्चित रूप से फोकसैननल में फ्लोपेनल को लपेट सकते हैं। – Zwik

+0

हां, 'फोकस पैनेल' 'सरल पैनेल 'कार्यान्वयन है, इसलिए इसमें एक से अधिक बच्चे विजेट नहीं हो सकते हैं। लेकिन अगर आपके 'फ्लोपेनल' में केवल एक ही है, तो आप इसे आसानी से 'फोकस पैनेल' के साथ बदल सकते हैं :)। –

+2

ठीक है, केवल 1 बच्चे के लिए फ़्लोपेनल का उपयोग करना बेकार होगा। – Zwik

8

असल में, आप इस के लिए जाना:

FlowPanel fPanel = new FlowPanel() { 
     @Override 
     public void onAttach() { 
      super.onAttach(); 
      super.addDomHandler(handler, ClickEvent.getType()); // handler is the instance   
                   // of your ClickHandler 
     } 
} 

चीयर्स !!!

+1

हां, यह थोड़ा सा हैक-रास्ता है, लेकिन यदि उपयोगकर्ता फ्लोपेनल उपयोग से प्रतिबंधित है, तो यह चाल उसके लिए एक काम कर सकती है। धन्यवाद –

+0

अगर मैं यह उत्तर कई अपवॉट्स दे सकता हूं तो मैं चाहता हूं। – saihgala

5

यह मेरे लिए काम किया (जाहिर है, स्थानापन्न अपने clickhandler के नाम के साथ "अपने CLICKHANDLER"):

FlowPanel field = new FlowPanel(); 

field.addDomHandler(YOUR CLICKHANDLER, ClickEvent.getType()); 
6

सबसे अच्छा समाधान मैं इस के लिए मिला here था।

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

public class MouseAwareFlowPanel extends FlowPanel implements 
HasMouseOverHandlers, HasMouseOutHandlers, HasClickHandlers 
{ 
    public HandlerRegistration addMouseOverHandler(MouseOverHandler handler) 
    { 
     return addDomHandler(handler, MouseOverEvent.getType()); 
    } 
    public HandlerRegistration addMouseOutHandler(MouseOutHandler handler) 
    { 
     return addDomHandler(handler, MouseOutEvent.getType()); 
    } 
    public HandlerRegistration addClickHandler(ClickHandler handler) 
    { 
     return addDomHandler(handler, ClickEvent.getType()); 
    } 
} 
+0

यह उन लोगों के लिए भी एक अच्छा समाधान है जो सभी प्रकार की घटनाएं प्राप्त नहीं करना चाहते हैं! धन्यवाद! –

0

बस एक FocusPanel साथ FlowPanel, कि अन्य उपयोगकर्ता बातचीत के लिए भी तैयार विजेट छोड़ देंगे लपेट:

स्रोत:

FlowPanel flowPanel = new FlowPanel(); 
    FocusPanel focusPanel = new FocusPanel(flowPanel); 
    focusPanel.addClickHandler(new ClickHandler() { 
     @Override 
     public void onClick(ClickEvent event) { 
      Window.alert("Hi!"); 
     } 
    });