我仍然不知道官方解决方案,我开始认为这是 GXT 2.x 中的一个错误,但我能够想出一个解决方法并将其发布在这里,以防其他人遇到类似的问题.
对于初学者来说,这个问题似乎出现在 Firefox 而不是 IE 中。对于 Firefox,以下工作(摘要后的示例代码片段):
Events.OnContextMenu
为组件/容器/面板/等上
的事件添加监听器。
- 重写该
handleEvent
方法并添加一个原生方法以使用 JS 来检测用户是否在屏幕上选择了文本。如果选择了文本,请将其保存到 JavaScriptObject(GWT 提供的 JS 对象的不透明包装,请参阅 GWT 文档了解详细信息)。
Events.Show
为上下文菜单对象上
的事件添加一个侦听器。
- 覆盖该
handleEvent
方法,添加一个native方法使用JS重新选择之前的选择。
Events.Hide
为上下文菜单对象上
的事件添加一个侦听器。
- 覆盖 handleEvent 方法并清除我们的选择变量,然后运行本机方法以清除任何剩余的选择(如果需要)。
使用这些步骤,我能够在 Firefox 中显示上下文菜单时保持选中的文本。
示例代码
(这些只是示例代码块,以帮助更好地说明这些步骤 - 此代码的复制/粘贴不会为您提供所需的一切)
public class ContextMenuExample {
JavaScriptObject selection;
Menu contextMenu = new Menu();
public void buildPanelExample() {
ContentPanel panel = new ContentPanel();
panel.addListener(Events.onContextMenu, new Listener<BaseEvent>() {
if (!GXT.isIE) {
selection = findSelectedTextOnScreen();
}
});
contextMenu.addListener(Events.Show, new Listener<BaseEvent>() {
if (!GXT.isIE) {
reSelectText(selection);
}
});
contextMenu.addListener(Events.Hide, new Listener<BaseEvent>() {
if (!GXT.isIE) {
clearSelection();
}
});
private native JavaScriptObject findSelectedTextOnScreen() /*-{
// use JS method to get selected text as a range
return selectedText;
}-*/;
private native void reSelectedText(JavaScriptObject range) /*-{
// use JS method to find a range a select it
}-*/;
private native void clearSelection() /*-{
// us JS to clear any selected ranges
}-*/;
private void clearSelections() {
selection = null;
clearSelection();
}
}
}