我有一个BorderPane
。在此 Pane 中,我将 HBox
设置为顶部有几个控件。在中心我有e SplitPane
有两个 Canvas 。我想让鼠标移动到 BorderPane
当它从SplitPane
冒泡时。
如果我使用 splitPane.setOnMouseMoved(...)
我正确地了解了该事件。然而BorderPane.setOnMouseMoved(...)
仅当鼠标悬停在顶部上时才有效(如果找到 HBox
)。
看起来像SplitPane
正在消耗该事件。谁能证实这一点吗?如果是这样,我该如何让偶数冒泡?请注意,当我应用过滤器时,偶数会在 BorderPane
处检测到。水平正在下降。
TIA
最佳答案
大多数(如果不是全部)皮肤实现都从 SkinBase
延伸。默认情况下消耗所有鼠标事件。您可以通过 protected 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 中成为公共(public) API。如果您使用 JavaFX 8,则需要扩展内部外观类。
然后您将设置 SplitPane
的外观。
SplitPane pane = ...;
pane.setSkin(new MySplitPaneSkin(pane));
还可以设置皮肤using CSS通过 -fx-skin
属性:
.split-pane {
-fx-skin: com.example.MySplitPaneSkin;
}
请注意,如上所述使用 CSS 将为样式表覆盖的所有 SplitPane
设置外观(除非您更改其样式类)。您可能希望通过为您的 SplitPane
提供一个 ID 并使用 #id { ... }
来使其更加具体。
此外,查看 JavaFX 11.0.2 中的 SplitPaneSkin
实现,每个分隔符中添加了一个事件处理程序,该处理程序消耗所有事件。由于这是私有(private)实现细节,您无法更改此行为。换句话说,即使使用上面的代码,当鼠标位于分隔线上方时,鼠标事件也不会冒泡到 BorderPane
。
要考虑的另一件事是 SplitPane
中的任何控件也可能会消耗鼠标事件。您需要为每个此类子控件应用与上述类似的内容。
关于JavaFX SplitPane 不会冒泡鼠标事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54736344/