JavaFX SplitPane 不会冒泡鼠标事件

JavaFX SplitPane does not bubble up mouse event

我有一个BorderPane。在此窗格中,我已将 topHBox 设置为带有多个控件。在 center 我有一个 SplitPane 有两个画布。当它从 SplitPane 冒泡时,我想在 BorderPane 移动鼠标。

如果我使用 splitPane.setOnMouseMoved(...),我会正确地获取事件。但是 BorderPane.setOnMouseMoved(...) 仅在鼠标悬停在 top 上时有效(如果找到 HBox)。

似乎 SplitPane 正在消耗该事件。谁能证实这一点?如果是这样,我如何让偶数冒泡?请注意,当我应用过滤器时,偶数在 BorderPane 水平下降时被检测到。

TIA

大多数(如果不是全部)皮肤实现都从 SkinBase which consumes all mouse events by default. You can configure this via the protected consumeMouseEvents(boolean) 方法扩展而来。由于该方法受到保护,因此您必须子class 皮肤(或使用反射)才能访问它:

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);
    }

}

皮肤 classes 在 JavaFX 9 中变成了 public API。如果您使用的是 JavaFX 8,则需要扩展内部皮肤 class.

然后您将设置 SplitPane 的皮肤。

SplitPane pane = ...;
pane.setSkin(new MySplitPaneSkin(pane));

您还可以通过 -fx-skin 属性:

设置皮肤 using CSS
.split-pane {
    -fx-skin: com.example.MySplitPaneSkin;
}

请注意,如上使用 CSS 将为样式表覆盖的 所有 SplitPane 设置皮肤(除非您更改它们的样式class).您可能希望通过为您的 SplitPane 提供 ID 并使用 #id { ... }.

来使其更加具体

此外,查看 JavaFX 11.0.2 中的 SplitPaneSkin 实现,一个事件处理程序被添加到每个使用所有事件的分隔符。由于这是私有实现细节,因此您无法更改此行为。换句话说,即使使用上面的代码,当鼠标悬停在分隔线上方时,鼠标事件也不会冒泡到您的 BorderPane

另一件需要考虑的事情是 SplitPane 中的任何控件也可能会消耗鼠标事件。您需要为每个此类子控件应用与上述类似的内容。