1

我有一个BorderPane. 在此窗格中,我已将几个控件设置为顶部HBox。在中心我有 eSplitPane有两个画布。我想让鼠标在BorderPane它从SplitPane.

如果我使用 asplitPane.setOnMouseMoved(...)我正确地得到了事件。但是 aBorderPane.setOnMouseMoved(...)仅在鼠标悬停在顶部时才有效(如果HBox找到了)。

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

TIA

4

1 回答 1

2

大多数(如果不是全部)皮肤实现扩展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 将为样式表覆盖的所有 SplitPanes 设置外观(除非您更改它们的样式类)。您可能希望通过提供您SplitPane的 ID 并使用#id { ... }.

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

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

于 2019-02-17T20:30:44.980 回答