面冷心慈的饭盒 · 单义带队考察四川遂宁天齐锂业有限公司-政务要 ...· 3 月前 · |
憨厚的烈酒 · 【传说中的】神父受胎!!!高能!慎入!_哔哩 ...· 7 月前 · |
从容的香蕉 · (产业研究)锂电池行业发展现状与未来趋势-宣 ...· 1 年前 · |
痴情的雪糕 · 在杭州第十四中学(凤起校区)就读是一种怎样的 ...· 1 年前 · |
奔跑的哑铃 · 湖南大学刘继磊课题组招聘电化学方向博士后 ...· 1 年前 · |
我正在处理一个JavaFX 2.2项目,我想设置TreeItem上的鼠标(双)单击事件的自定义处理。使用 treeview.setOnMouseClicked ,我可以在没有错误的情况下启动我的代码,但问题是,每当鼠标双击时,TreeItem就会在展开和折叠之间切换。我想这是默认行为,但我是如何禁用它的??
发布于 2014-01-12 11:23:57
我有同样的问题,并及时解决了使用
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));
}
发布于 2016-09-01 15:09:58
事实证明,尽管博格的答案有效,但严格来说,这并不是“正确”的方法,而且可能会导致一些意想不到的行为。
这只虫子 中描述了此问题的原因。总结一下:树单元格的默认双击行为实际上是由鼠标按下事件造成的,因此,使用该事件并在鼠标单击侦听器中阻止它为时已晚。
接受的答案之所以有效,是因为它没有过滤鼠标事件类型,这意味着它消耗了与主按钮相关的所有鼠标事件和点击计数为2。这也意味着用户操作被处理了三次,这可能不是预期的行为。
修复只是对Bolg的答案的单一行的改变,但我认为最好不要涉及EventDispatcher。像下面这样的东西应该可以正常工作:
node.addEventHandler(MouseEvent.ANY, event -> {
if (event.getClickCount() == 2 && event.getButton().equals(MouseButton.PRIMARY)) {
if (event.getEventType().equals(MouseEvent.MOUSE_CLICKED)) {