我正在开发一个 JavaFX 2.2 项目,我想在 TreeItem 上设置鼠标(双击)单击事件的自定义处理。使用treeview.setOnMouseClicked我触发我的代码没有错误,但问题是 TreeItem,在每次鼠标双击时,它会在展开和折叠之间切换。我想这是默认行为,但我如何禁用它?
问问题
4270 次
2 回答
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);
}
}
然后将其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));
}
}
};
}
}
于 2014-01-12T11:23:57.643 回答
2
事实证明,尽管 Bolg 的答案有效,但严格来说它并不是“正确”的方法,并且可能会导致一些意想不到的行为。
此错误中描述了此问题的原因。总结一下:树单元的默认双击行为实际上是由鼠标按下事件引发的,因此在鼠标单击侦听器中消耗该事件并阻止它为时已晚。
接受的答案有效的原因是它不过滤鼠标事件类型,这意味着它消耗与主按钮相关的所有鼠标事件和两次点击次数。这也意味着用户操作被处理了 3 次,这可能不是预期的行为。
修复只是对 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();
}
});
于 2016-09-01T15:09:58.990 回答