Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在GWT中,如果按下Shift按钮,如何从树中的SelectionEvent中知道_Java_Gwt_Event Handling - Fatal编程技术网

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

Java 在GWT中,如果按下Shift按钮,如何从树中的SelectionEvent中知道,java,gwt,event-handling,Java,Gwt,Event Handling,我尝试在GWT中创建一个具有多个节点选择的树,遇到了类似于此问题的问题。 当从树中引发selectionEvent时,我想知道是否按下了Shift键 SelectionHandler<TreeItem> getSelectionHandler() { return new SelectionHandler<TreeItem>(){ @Override public void onSelection(SelectionEvent<

我尝试在GWT中创建一个具有多个节点选择的树,遇到了类似于此问题的问题。 当从树中引发selectionEvent时,我想知道是否按下了Shift键

SelectionHandler<TreeItem> getSelectionHandler() {
    return new SelectionHandler<TreeItem>(){
        @Override
        public void onSelection(SelectionEvent<TreeItem> event) {
            // is shift key pressed ?
        }
    };
}
SelectionHandler getSelectionHandler(){
返回新的SelectionHandler(){
@凌驾
选举时公共无效(SelectionEvent事件){
//按下shift键了吗?
}
};
}
上述问题中的解决方案在这种情况下不适用,因为SelectionHandler类没有从DomeEvent继承,因此没有getNativeEvent()函数

我尝试了一个肮脏的解决方案,通过使用布尔标志将keyDownEventHandler和keyUpEventHandler添加到树中,但仅当焦点位于树上时才调用处理程序,因此这不起作用

是否有一个简单的解决方案(或者仅仅是一个解决方案,即使它并不简单)?谢谢

编辑aem响应:
解决方案可以通过将组件封装在带有键向上/向下处理程序的FocusPanel中来实现,但是我不能添加任何需要键盘输入的组件,例如TextArea,因为“全局”处理程序具有优先权。。。所以这并不能真正解决我的问题。

我不确定这是否有效,但值得一试:

如何将键处理程序添加到包含树的根面板中,并让它们设置一个布尔值,指示Shift键是否已关闭?然后树的SelectionHandler可以检查该布尔值


这样做的问题是,页面可能包含捕获关键事件的其他小部件,这会让用户觉得这种行为很不正常。

我的建议是创建一个自定义树类,临时存储事件,并通过重写
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;
   }
}