Disable TreeItem's default expand/collapse on double click JavaFX 2.2
我正在开发一个JavaFX2.2项目,我想在树项上设置鼠标(双击)事件的自定义处理。使用treeview.setonmouseclicked,我可以毫无错误地启动代码,但问题是,在每次鼠标双击时,treeitem都在展开和折叠之间切换。我认为这是默认行为,但我如何禁用它??
我也遇到了同样的问题,并使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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); } } |
然后用这个
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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)); } } }; } } |
结果表明,虽然博格的回答有效,但这并不是一个严格的"正确"的方法,而且可能导致一些意想不到的行为。
此错误中描述了此问题的原因。总结一下:树单元的默认双击行为实际上是由鼠标按下事件触发的,因此使用事件并在鼠标单击侦听器中阻止它为时已晚。
接受的答案起作用的原因是它不过滤鼠标事件类型,这意味着它将消耗与主按钮相关的所有鼠标事件,并单击两次。这也意味着用户操作被处理了三次,这可能不是预期的行为。
修复只是对Bolg答案的单行更改,但我认为最好不要涉及事件调度器。像下面这样的工作应该很好:
1 2 3 4 5 6 7 8 9 | 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(); } }); |