我尝试在GWT中创建一个具有多个节点选择的树,并遇到类似于这个问题Shift Key in GWT?的问题。 当从树中引发selectionEvent时,我想知道是否按下Shift键。
SelectionHandler<TreeItem> getSelectionHandler() {
return new SelectionHandler<TreeItem>(){
@Override
public void onSelection(SelectionEvent<TreeItem> event) {
// is shift key pressed ?
}
};
}
上面问题中的解决方案在这种情况下不适用,因为SelectionHandler类不从DOMEvent继承,然后没有getNativeEvent()函数。
我通过使用布尔标志将keyDownEventHandler和keyUpEventHandler添加到树中来尝试了一个脏解决方案,但只有当焦点在树上时才会调用处理程序,因此这不起作用。
是否有一个简单的解决方案(或者只是解决方案,即使它不简单)?感谢。
编辑aem回复: 解决方案可以通过使用keyUp / DownHandler将组件封装在FocusPanel中,但是我无法添加任何需要键盘输入的组件,例如TextArea,因为“全局”处理程序优先级...所以它并没有真正解决我的问题。
答案 0 :(得分:3)
我的建议是创建一个自定义Tree类,通过覆盖onBrowseEvent
方法临时存储事件并存储此事件。然后,您可以在onSelection
方法中通过检查此存储的事件来检查是否按下了shift键。由于JavaScript不是并发的,因此使用私有变量应该没问题。代码将是这样的:
public class MyTree extends Tree {
private Event currentEvent;
... constructors...
// Call this method from within the onSelection method to determine if the shift key
// was pressed.
public boolean isShiftPressed() {
return currentEvent != null ? currentEvent.getShiftKey() : false;
}
@Override
public void onBrowserEvent(Event event) {
currentEvent = event;
super.onBrowserEvent(event);
currentEvent = null;
}
}
答案 1 :(得分:1)
我不确定这是否有效,但值得一试:
如何将键处理程序添加到包含Tree的根面板,并让它们设置一个布尔值来指示Shift键是否已关闭?然后树的SelectionHandler可以检查该布尔值。
这样做的问题在于页面可能包含捕获关键事件的其他小部件,这会使这种行为对用户来说显得不稳定。