簡體   English   中英

GWT / GWTBootstrap3擴展工具提示:C'tor中的addHandler異常

[英]GWT / GWTBootstrap3 Extending Tooltip: Exception with addHandler in C'tor

我創建了以下類作為gwtbootstrap3 Tooltip的擴展。 我要派生gwtbootstrap3 Tooltip類的原因至少有兩個:

1.)在顯示工具提示時添加onWindowClosing處理程序,以便我可以在用戶離開頁面時隱藏()工具提示(據我所知,這是Bootstrap不支持的功能,是嗎?)

2.)我想防止在iPad或iPhone上顯示頁面時顯示工具提示,因為當涉及到工具提示時它們的行為很奇怪(第一個提示顯示tooltip,第二個提示執行按鈕,這與用戶期望的不完全相同) )

請注意,下面給出的類仍未完成...但是在此階段,添加處理程序時出現了異常。 還請注意,無論我添加哪種類型的處理程序(ShowHandler,ShownHandler等),它都會引發異常。

任何幫助,不勝感激。

    package com.mypackage.client.widgets.featureWidgets;
    import org.gwtbootstrap3.client.shared.event.ShowEvent;
    import org.gwtbootstrap3.client.shared.event.ShowHandler;
    import org.gwtbootstrap3.client.ui.constants.Trigger;

    import com.google.gwt.event.shared.HandlerRegistration;
    import com.google.gwt.user.client.Window;
    import com.google.gwt.user.client.Window.ClosingEvent;

    public class Tooltip extends org.gwtbootstrap3.client.ui.Tooltip {

        private boolean isMobile;
        private HandlerRegistration windowClosingHandlerRegistration;
        private final Tooltip tooltip;

        public Tooltip() {
            super();
            tooltip = this;

            this.addShowHandler(new ShowHandler() {
                @Override
                public void onShow(final ShowEvent showEvent) {
                    // TODO Auto-generated method stub
                    if (windowClosingHandlerRegistration == null) {
                        windowClosingHandlerRegistration = Window.addWindowClosingHandler(new Window.ClosingHandler() {
                            @Override
                            public void onWindowClosing(final ClosingEvent arg0) {
                                tooltip.hide();
                            }
                        });
                    }

                }
            });
        }


    }


    When I create a instance of this tooltip using the following:

    [...]
        <b:ButtonToolBar ui:field="itemButtonToolBar" addStyleNames="hiddenPrint">
        <b:ButtonGroup>

            <a:Tooltip title="{msgs.buttomTitleAddItem}" container="body">
                <b:Button ui:field="addItemButton" icon="PLUS"/>
            </a:Tooltip>                                        
    [...]

嘗試添加處理程序時,出現以下異常,為什么?

    SEVERE: (TypeError) : Cannot read property 'addHandler_11_g$' of undefinedcom.google.gwt.core.client.JavaScriptException: (TypeError) : Cannot read property 'addHandler_11_g$' of undefined
        at Unknown.addShowHandler_2_g$(meetingApp-0.js@26:57195)
        at Unknown.Tooltip_6_g$(meetingApp-0.js@8:57685)
        at Unknown.build_f_Tooltip2_0_g$(meetingApp-0.js@55:31606)
        at Unknown.get_f_Tooltip2_0_g$(meetingApp-0.js@15:31831)
        at Unknown.build_f_ButtonGroup1_0_g$(meetingApp-0.js@38:31524)
        at Unknown.get_f_ButtonGroup1_0_g$(meetingApp-0.js@15:31791)
        at Unknown.build_itemButtonToolBar_0_g$(meetingApp-0.js@41:31696)
        at Unknown.get_itemButtonToolBar_0_g$(meetingApp-0.js@15:31876)
        at Unknown.createAndBindUi_58_g$(meetingApp-0.js@91:31437)
        at Unknown.createAndBindUi_59_g$(meetingApp-0.js@15:31441)
        at Unknown.ItemButtonGroup_2_g$(meetingApp-0.js@56:30733)
        at Unknown.$init_589_g$(meetingApp-0.js@31:37722)
        at Unknown.SummaryWidget_1_g$(meetingApp-0.js@8:37686)
        at Unknown.loadSummaryWidget_0_g$(meetingApp-0.js@26:4991)
        at Unknown.setSummary_1_g$(meetingApp-0.js@10:5028)
        at Unknown.onSuccess_8_g$(meetingApp-0.js@21:3312)
        at Unknown.onSuccess_9_g$(meetingApp-0.js@8:3317)
        at Unknown.onResponseReceived_0_g$(meetingApp-0.js@26:156917)
        at Unknown.fireOnResponseReceived_0_g$(meetingApp-0.js@17:129224)
        at Unknown.onReadyStateChange_0_g$(meetingApp-0.js@28:129532)
        at Unknown.<anonymous>(meetingApp-0.js@18:172082)
        at Unknown.apply_0_g$(meetingApp-0.js@28:104636)
        at Unknown.entry0_0_g$(meetingApp-0.js@16:104692)
        at Unknown.<anonymous>(meetingApp-0.js@14:104672)

免責聲明:我使用gwtbootstrap3 v0.9.2,並且我相信它與您使用的版本相同,因為您的代碼遇到相同的錯誤。

工具提示需要一個小部件才能進行操作(在您的情況下,按鈕是工具提示的小部件)。 工具提示使用它的小部件來處理所有事件-例如,請參見addShowHandler 源代碼

現在,您需要了解如何構建整個結構:

  • 首先創建工具提示(不設置小部件)
  • 然后創建按鈕
  • 調用工具提示的setWidget方法將按鈕設置為小部件

因此,當在構造函數中使用addShowHandler方法時,實際上是在widget為null時調用widget.addHandler

您可以通過Window.alert(tooltip.getWidget() == null ? "null" : tooltip.getWidget().toString());


有幾種方法可以使它起作用(越晚越好):

  1. 等待通過調度延遲命令來構建DOM結構(如果您確定最終將設置小部件):

     Scheduler.get().scheduleDeferred(new ScheduledCommand() { @Override public void execute() { // set up events handling } }); 
  2. 重寫setWidget方法(請注意,有兩種方法: setWidget(Widget w)setWidget(IsWidget w) ):

     @Override public void setWidget(Widget w) { super.setWidget(w); // set up events handling } 
  3. 您不需要在showEvent處理程序中添加addWindowClosingHandler ,您可以直接在構造函數中執行此操作:

     public class Tooltip extends org.gwtbootstrap3.client.ui.Tooltip { private boolean isMobile; private final Tooltip tooltip; public Tooltip() { super(); tooltip = this; Window.addWindowClosingHandler(new Window.ClosingHandler() { @Override public void onWindowClosing(final ClosingEvent arg0) { tooltip.hide(); } }); } } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM