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

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

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

TIA

最佳答案

大多数(如果不是全部)外观设计都是从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属性设置外观:

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


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

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

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

10-07 20:30