首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >禁用TreeItem的默认展开/折叠,双击JavaFX 2.2

禁用TreeItem的默认展开/折叠,双击JavaFX 2.2
EN

Stack Overflow用户
提问于 2013-03-19 19:55:36
回答 2查看 4.4K关注 0票数 5

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-12 11:23:57

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

代码语言:javascript
运行
复制
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);
    }
}

然后使用这个TreeMouseEventDispatcher作为TreeCell

代码语言:javascript
运行
复制
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));
        }
      }
    };
  }
}
票数 4
EN

Stack Overflow用户

发布于 2016-09-01 15:09:58

事实证明,尽管博格的答案有效,但严格来说,这并不是“正确”的方法,而且可能会导致一些意想不到的行为。

这只虫子中描述了此问题的原因。总结一下:树单元格的默认双击行为实际上是由鼠标按下事件造成的,因此,使用该事件并在鼠标单击侦听器中阻止它为时已晚。

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

修复只是对Bolg的答案的单一行的改变,但我认为最好不要涉及EventDispatcher。像下面这样的东西应该可以正常工作:

代码语言:javascript
运行
复制
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();
    }
});
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15509203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档