JavaFX SplitPane 不会冒泡鼠标事件

标签 java javafx mouseevent splitpane

我有一个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/

相关文章:

java - JFreeChart 日期轴格式化问题

Java Realm 结果在 Java 7 中排序?

JavaFX 将 SimpleBooleanProperty 绑定(bind)到多个属性

java - 当父 Pane 在 JavaFX 中具有 -fx-border-radius 时,子 Pane css 样式

javascript - JS 特殊鼠标按钮

java - 将字符串数组转换为 Map

java - 子组件宽度超过父组件

java - 我无法点击按钮

Javascript:选择时防止下拉菜单打开

java - AWT(扩展)修饰符何时保证有效?