我有一个BorderPane。在此窗格中,我将具有多个控件的top设置为HBox。在中心,有两个画布的e SplitPane。我想让鼠标在BorderPane上移动,当它从SplitPane上冒出来时。
如果我使用splitPane.setOnMouseMoved(...),就会正确地得到事件。但是,只有当鼠标悬停在BorderPane.setOnMouseMoved(...)顶部(如果找到HBox )时,HBox才能工作。
SplitPane似乎正在消耗这个事件。有人能证实这一点吗?如果是这样的话,我怎样才能让偶数泡起来呢?注意,当我应用过滤器时,在下降的过程中会在BorderPane级别检测到偶数。
提亚
发布于 2019-02-17 20:30:44
大多数皮肤实现(如果不是全部)都是从默认消耗所有鼠标事件的SkinBase扩展而来的。您可以通过受保护的consumeMouseEvents(boolean)方法对其进行配置。由于该方法受到保护,您必须子类皮肤(或使用反射)来访问它:
package com.example;
import javafx.scene.control.SplitPane;
import javafx.scene.control.skin.SplitPaneSkin;
public class MySplitPaneSkin extends SplitPaneSkin {
public MySplitPaneSkin(SplitPane control) {
super(control);
consumeMouseEvents(false);
}
}在JavaFX 9中,皮肤类变成了公共API。如果您使用的是JavaFX 8,则需要扩展内部皮肤类。
然后设置SplitPane的外观。
SplitPane pane = ...;
pane.setSkin(new MySplitPaneSkin(pane));还可以通过使用CSS属性设置皮肤-fx-skin:
.split-pane {
-fx-skin: com.example.MySplitPaneSkin;
}请注意,如上所述,使用CSS将为样式表所涵盖的所有SplitPane设置皮肤(除非您更改了它们的样式)。您可能希望通过给SplitPane一个ID并使用#id { ... }来使其更加具体。
此外,查看SplitPaneSkin 11.0.2中的JavaFX实现,将一个事件处理程序添加到每个分隔器中,该分隔符将消耗所有事件。由于这是一个私有实现细节,所以不能更改此行为。换句话说,即使使用上面的代码,当鼠标越过分隔符时,鼠标事件也不会冒泡到BorderPane。
需要考虑的另一件事是,SplitPane中的任何控件也可能会消耗鼠标事件。您需要为每个这样的子控件应用类似于上面的内容。
https://stackoverflow.com/questions/54736344
复制相似问题