禁用TreeItem';双击JavaFX 2.2时的默认展开/折叠

禁用TreeItem';双击JavaFX 2.2时的默认展开/折叠,java,treeview,mouseevent,javafx-2,javafx,Java,Treeview,Mouseevent,Javafx 2,Javafx,我正在处理一个JavaFX2.2项目,我想在树项目上设置鼠标(双击)事件的自定义处理。使用treeview.setOnMouseClicked我启动代码时没有错误,但问题是,每次鼠标双击TreeItem时,它都会在展开和折叠之间切换。我想这是默认行为,但我如何禁用它呢?我遇到了同样的问题,并使用EventDispatcher及时解决了它 class TreeMouseEventDispatcher implements EventDispatcher { private final Ev

我正在处理一个JavaFX2.2项目,我想在树项目上设置鼠标(双击)事件的自定义处理。使用treeview.setOnMouseClicked我启动代码时没有错误,但问题是,每次鼠标双击TreeItem时,它都会在展开和折叠之间切换。我想这是默认行为,但我如何禁用它呢?

我遇到了同样的问题,并使用
EventDispatcher
及时解决了它

class TreeMouseEventDispatcher implements EventDispatcher {
    private final EventDispatcher originalDispatcher;

    public TreeMouseEventDispatcher(EventDispatcher originalDispatcher) {
      this.originalDispatcher = originalDispatcher;
    }

    @Override
    public Event dispatchEvent(Event event, EventDispatchChain tail) {
        if (event instanceof MouseEvent) {
           if (((MouseEvent) event).getButton() == MouseButton.PRIMARY
               && ((MouseEvent) event).getClickCount() >= 2) {

             if (!event.isConsumed()) {
               // Implement your double-click behavior here, even your
               // MouseEvent handlers will be ignored, i.e., the event consumed!
             }

             event.consume();
           }
        }
        return originalDispatcher.dispatchEvent(event, tail);
    }
}
然后将此
treemouseventdispatcher
用于
TreeCell

treeView.setCellFactory(new Callback<TreeView<T>, TreeCell<T>>() {
  @Override
  public TreeCell<T> call(TreeView<T> param) {
    return new TreeCell<T>() {
      @Override
      protected void updateItem(T item, boolean empty) {
        if (item != null && !empty) {
          EventDispatcher originalDispatcher = getEventDispatcher();
          setEventDispatcher(new TreeMouseEventDispatcher(originalDispatcher));
        }
      }
    };
  }
}
treeView.setCellFactory(新回调(){
@凌驾
公共TreeCell调用(TreeView参数){
返回新的TreeCell(){
@凌驾
受保护的void updateItem(T项,布尔值为空){
如果(项!=null&&!空){
EventDispatcher originalDispatcher=getEventDispatcher();
setEventDispatcher(新的TreeMouseEventDispatcher(原始Dispatcher));
}
}
};
}
}

结果表明,尽管Bolg的答案有效,但严格来说,这不是一种“正确”的方法,可能会导致一些意外行为

此问题的原因在中进行了描述。总结:树单元的默认双击行为实际上是由鼠标按下事件引起的,因此,在鼠标单击侦听器中使用该事件并阻止它已经太晚了

接受答案有效的原因是它不会过滤鼠标事件类型,这意味着它会使用与主按钮和两次单击计数相关的所有鼠标事件。这也意味着用户操作会被处理三次,这可能不是预期的行为

修复只是对Bolg答案的一行更改,但我认为最好不要涉及EventDispatcher。类似于以下内容的内容应该可以正常工作:

node.addEventHandler(MouseEvent.ANY, event -> {
    if (event.getClickCount() == 2 && event.getButton().equals(MouseButton.PRIMARY)) {
        if (event.getEventType().equals(MouseEvent.MOUSE_CLICKED)) {
            System.out.println("hello"); // perform some action
        }

        event.consume();
    }
});

尝试在…之前查看论坛。[1]:我的问题是树的默认双击行为项不是鼠标单击事件的检测。通过treeview.setOnMouseClicked,我检测到事件没有问题,但这不是我要查找的。树项在双击时默认会自行展开和折叠,这是我的问题。我想禁用它。谢谢-我也不得不使用这个!这个答案只是偶然的!因为它在另一个方面被破坏了。我正在添加另一个答案来解释这个问题。