我有一个BorderPane
。在此窗格中,我将具有多个控件的HBox
设置为 top 。在中心中,我有一个SplitPane
,其中有两个画布。我想让鼠标从BorderPane
起跳时在SplitPane
处移动鼠标。
如果我使用splitPane.setOnMouseMoved(...)
,则可以正确获取事件。但是,BorderPane.setOnMouseMoved(...)
仅在鼠标悬停在顶部(找到HBox
)上时有效。
似乎SplitPane
正在使用该事件。有人可以确认吗?如果是这样,我该如何使起泡上升?请注意,当我应用过滤器时,会在向下的BorderPane
级别检测到偶数。
TIA
答案 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
中的任何控件也可能会消耗鼠标事件。您需要为每个此类子控件应用与上述类似的内容。