我创建了以下类作为gwtbootstrap3 Tooltip的扩展。我想要派生gwtbootstrap3 Tooltip类至少有两个原因:
1。)当显示工具提示时添加一个onWindowClosing Handler,这样我就可以在用户离开页面时隐藏()工具提示(据我所知 - 这个功能在Bootstrap中也不支持,是吗?)
2。)我想防止在iPad或iPhone上显示页面时显示工具提示,因为当涉及工具提示时它们表现得很奇怪(第一个提示显示工具提示,第二个提示执行按钮,这不完全是什么用户期望)
请注意,下面给出的类仍未完成......但在此阶段我在添加处理程序时遇到异常。 还请注意,无论我添加什么类型的Handler(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>
[...]
尝试添加Handler时出现以下异常,为什么?
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)
答案 0 :(得分:2)
免责声明:我使用gwtbootstrap3 v0.9.2并且我认为它与您使用的版本相同,因为我的代码出现了相同的错误。
工具提示需要一个小工具来操作(在你的情况下,按钮是一个工具提示的小部件)。工具提示使用它的小部件来执行所有事件处理 - 例如,请参阅addShowHandler
setWidget
。
现在您需要了解整个结构的构建方式:
addShowHandler
方法将按钮设置为小部件因此,当您在构造函数中使用widget.addHandler
方法时,实际上在窗口小部件为空时调用Window.alert(tooltip.getWidget() == null ? "null" : tooltip.getWidget().toString());
。
您可以Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override
public void execute() {
// set up events handling
}
});
有几种方法可以使它工作(越晚越好):
通过调度延迟命令等待构建DOM结构(如果您确定最终将设置该小部件):
setWidget
覆盖setWidget(Widget w)
方法(请注意,有两种方法:setWidget(IsWidget w)
和@Override
public void setWidget(Widget w) {
super.setWidget(w);
// set up events handling
}
):
addWindowClosingHandler
您不需要showEvent
处理程序中的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();
}
});
}
}
,您可以直接在构造函数中执行此操作:
{{1}}