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

我正在研究JavaFX 2.2项目,我想在TreeItem上设置鼠标(双)单击事件的自定义处理。 使用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, ie, the event consumed! } event.consume(); } } return originalDispatcher.dispatchEvent(event, tail); } } 

然后将此TreeMouseEventDispatcher用于TreeCell

 treeView.setCellFactory(new Callback, TreeCell>() { @Override public TreeCell call(TreeView param) { return new TreeCell() { @Override protected void updateItem(T item, boolean empty) { if (item != null && !empty) { EventDispatcher originalDispatcher = getEventDispatcher(); setEventDispatcher(new TreeMouseEventDispatcher(originalDispatcher)); } } }; } } 

事实certificate,尽管Bolg的答案有效,但它并不是严格的“正确”方式,可能会导致一些意想不到的行为。

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

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

修复只是对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(); } });