JavaFX SplitPane不会使鼠标事件冒泡

时间:2019-02-17 18:29:29

标签: java javafx mouseevent splitpane

我有一个BorderPane。在此窗格中,我将具有多个控件的HBox设置为 top 。在中心中,我有一个SplitPane,其中有两个画布。我想让鼠标从BorderPane起跳时在SplitPane处移动鼠标。

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

似乎SplitPane正在使用该事件。有人可以确认吗?如果是这样,我该如何使起泡上升?请注意,当我应用过滤器时,会在向下的BorderPane级别检测到偶数。

TIA

1 个答案:

答案 0 :(得分:2)

大多数(如果不是全部)外观设计都是从SkinBase扩展而来的,默认情况下consumeMouseEvents(boolean)会消耗所有鼠标事件。您可以通过受保护的using CSS方法进行配置。由于该方法受到保护,因此您必须将皮肤子类化(或使用反射)来访问它:

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属性设置皮肤{{3}}:

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

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

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

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