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

Geo*_*lou 5 java treeview javafx mouseevent javafx-2

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

Jan*_*ovy 4

我遇到了同样的问题并及时使用解决了它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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将其TreeMouseEventDispatcher用于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));
        }
      }
    };
  }
}
Run Code Online (Sandbox Code Playgroud)