我正在开发一个JavaFX 2.2项目,并且我想在TreeItem上设置自定义处理鼠标(双击)事件。使用treeview.setOnMouseClicked我激发我的代码没有错误,但问题是,TreeItem,每一次鼠标双击,它在展开和折叠之间切换。我想这是默认行为,但我如何禁用它?在双击时禁用TreeItem的默认展开/折叠JavaFX 2.2
回答
我有同样的问题,并及时解决它使用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));
}
}
};
}
}
谢谢 - 我也必须使用它! – CMerrill 2015-08-12 01:29:47
这个答案只是偶然发生的!因为它以另一种方式被打破。我正在添加另一个解释该问题的答案。 – 2016-09-01 14:49:17
原来,虽然Bolg的答案的作品,它不是严格的“正确”的方式做到这一点,并可能导致一些意想不到的行为。
此问题的原因在this bug中描述。总结一下:树形单元的默认双击行为实际上是由鼠标按下事件引起的,因此消耗事件并在鼠标内阻止该事件已为时过晚单击侦听器。
接受答案的工作原理是它不会过滤鼠标事件类型,这意味着它消耗与主按钮有关的所有鼠标事件并且点击数为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();
}
});
- 1. 如何在XUL表中双击禁用展开/折叠
- 2. 手动展开/折叠所有treeitems内存成本javafx 2.2
- 3. 更改展开和折叠图像TreeView JavaFX 2.2
- 4. 在展开和折叠表格时默认隐藏行
- 5. C#EXT:GridCommand:单击单击展开双击折叠RowExpander
- 6. 折叠工具栏默认折叠
- 7. 展开/折叠Div
- 8. jquery展开/折叠?
- 9. 折叠/展开optgroups
- 10. 折叠/展开Groupboxes
- 11. 展开/折叠jQuery
- 12. 展开/折叠div点击多个div
- 13. 当点击时使用jquery展开/折叠表的2/3
- 14. 用css展开和折叠
- 15. 在Datagridview中展开/折叠
- 16. 折叠/展开的角
- 17. 如何折叠(折叠)Doxygen默认在vim中注释?
- 18. 如何禁用折叠/展开视图上滚动的CollapsingToolbarLayout?
- 19. 折叠时移动按钮展开
- 20. 同时展开/折叠几个区块?
- 21. WPF DataBound treeview展开/折叠
- 22. 折叠/展开图片
- 23. ExpandableListView展开和折叠
- 24. 展开并折叠tableview行
- 25. Delphi DBgrid展开/折叠
- 26. 展开和折叠UITableview
- 27. 展开/折叠div元素?
- 28. Android展开/折叠RelativeLayout
- 29. 展开/折叠与HierarchicalDataTemplate
- 30. 展开折叠Javascript代码?
尝试看看论坛之前... [http://stackoverflow.com/a/10950824/2170935][1] [1]:http://stackoverflow.com/a/10950824/2170935 – Perco 2013-03-20 13:52:55
我的问题是TreeItem的默认双击行为,而不是检测到鼠标单击事件。随着treeview.setOnMouseClicked我检测事件没有问题,但这不是我正在寻找。 TreeItem,双击时,默认情况下是扩展和折叠自己,这是我的问题。我想禁用它。 – 2013-03-20 16:49:39