【问题标题】:JavaFX SplitPane does not bubble up mouse eventJavaFX SplitPane 不会冒泡鼠标事件
【发布时间】:2019-07-11 04:36:02
【问题描述】:

我有一个BorderPane。在此窗格中,我将HBox 设置为top,并带有多个控件。在 中心 我有 e SplitPane 有两个画布。当SplitPane 冒泡时,我想在BorderPane 上移动鼠标。

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

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

TIA

【问题讨论】:

    标签: java javafx mouseevent splitpane


    【解决方案1】:

    大多数(如果不是全部)皮肤实现从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));
    

    你也可以通过-fx-skin属性设置皮肤using CSS

    .split-pane {
        -fx-skin: com.example.MySplitPaneSkin;
    }
    

    请注意,使用上述 CSS 将为样式表覆盖的 all SplitPanes 设置外观(除非您更改其样式类)。您可能希望通过为您的 SplitPane 提供一个 ID 并使用 #id { ... } 来使其更具体。

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

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

    【讨论】:

    • 工作就像一个魅力。不幸的是,我被 JavaFX 8 困住了。我还尝试了`splitPane.setStyle("-fx-skin: com.example.MySplitPaneSkin;")`,但没有奏效。至于 JavFX 11,您能想到的任何替代方案。我想避免以后再讨论这个问题。
    • 由于 JavaFX 8 是预模块系统,您可以将内部 SplitPaneSkin 子类化,而不必担心模块访问错误。当您移至 JavaFX 11+ 时,答案中的解决方案应该可以正常工作。注意,设置SplitPaneskin 的另一种方法是继承SplitPane 并覆盖createDefaultSkin;你仍然需要继承皮肤类。
    猜你喜欢
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 2017-05-02
    • 2021-01-18
    • 1970-01-01
    相关资源
    最近更新 更多