[英]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());
有幾種方法可以使它起作用(越晚越好):
等待通過調度延遲命令來構建DOM結構(如果您確定最終將設置小部件):
Scheduler.get().scheduleDeferred(new ScheduledCommand() { @Override public void execute() { // set up events handling } });
重寫setWidget
方法(請注意,有兩種方法: setWidget(Widget w)
和setWidget(IsWidget w)
):
@Override public void setWidget(Widget w) { super.setWidget(w); // set up events handling }
您不需要在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.