我有一个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
中的任何控件都可能还会消耗鼠标事件。您需要为每个此类子控件应用类似于上述内容的内容。