在GWT中,如果按下Shift按钮,如何从树中的SelectionEvent中获知

时间:2010-04-15 12:11:04

标签: java gwt event-handling

我尝试在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,因为“全局”处理程序优先级...所以它并没有真正解决我的问题。

2 个答案:

答案 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可以检查该布尔值。

这样做的问题在于页面可能包含捕获关键事件的其他小部件,这会使这种行为对用户来说显得不稳定。