JavaFX SplitPane 不会冒泡鼠标事件
JavaFX SplitPane does not bubble up mouse event
我有一个BorderPane
。在此窗格中,我已将 top 和 HBox
设置为带有多个控件。在 center 我有一个 SplitPane
有两个画布。当它从 SplitPane
冒泡时,我想在 BorderPane
移动鼠标。
如果我使用 splitPane.setOnMouseMoved(...)
,我会正确地获取事件。但是 BorderPane.setOnMouseMoved(...)
仅在鼠标悬停在 top 上时有效(如果找到 HBox
)。
似乎 SplitPane
正在消耗该事件。谁能证实这一点?如果是这样,我如何让偶数冒泡?请注意,当我应用过滤器时,偶数在 BorderPane
水平下降时被检测到。
TIA
大多数(如果不是全部)皮肤实现都从 SkinBase
which consumes all mouse events by default. You can configure this via the protected consumeMouseEvents(boolean)
方法扩展而来。由于该方法受到保护,因此您必须子class 皮肤(或使用反射)才能访问它:
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);
}
}
皮肤 classes 在 JavaFX 9 中变成了 public API。如果您使用的是 JavaFX 8,则需要扩展内部皮肤 class.
然后您将设置 SplitPane
的皮肤。
SplitPane pane = ...;
pane.setSkin(new MySplitPaneSkin(pane));
您还可以通过 -fx-skin
属性:
设置皮肤 using CSS
.split-pane {
-fx-skin: com.example.MySplitPaneSkin;
}
请注意,如上使用 CSS 将为样式表覆盖的 所有 SplitPane
设置皮肤(除非您更改它们的样式class).您可能希望通过为您的 SplitPane
提供 ID 并使用 #id { ... }
.
来使其更加具体
此外,查看 JavaFX 11.0.2 中的 SplitPaneSkin
实现,一个事件处理程序被添加到每个使用所有事件的分隔符。由于这是私有实现细节,因此您无法更改此行为。换句话说,即使使用上面的代码,当鼠标悬停在分隔线上方时,鼠标事件也不会冒泡到您的 BorderPane
。
另一件需要考虑的事情是 SplitPane
中的任何控件也可能会消耗鼠标事件。您需要为每个此类子控件应用与上述类似的内容。
我有一个BorderPane
。在此窗格中,我已将 top 和 HBox
设置为带有多个控件。在 center 我有一个 SplitPane
有两个画布。当它从 SplitPane
冒泡时,我想在 BorderPane
移动鼠标。
如果我使用 splitPane.setOnMouseMoved(...)
,我会正确地获取事件。但是 BorderPane.setOnMouseMoved(...)
仅在鼠标悬停在 top 上时有效(如果找到 HBox
)。
似乎 SplitPane
正在消耗该事件。谁能证实这一点?如果是这样,我如何让偶数冒泡?请注意,当我应用过滤器时,偶数在 BorderPane
水平下降时被检测到。
TIA
大多数(如果不是全部)皮肤实现都从 SkinBase
which consumes all mouse events by default. You can configure this via the protected consumeMouseEvents(boolean)
方法扩展而来。由于该方法受到保护,因此您必须子class 皮肤(或使用反射)才能访问它:
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);
}
}
皮肤 classes 在 JavaFX 9 中变成了 public API。如果您使用的是 JavaFX 8,则需要扩展内部皮肤 class.
然后您将设置 SplitPane
的皮肤。
SplitPane pane = ...;
pane.setSkin(new MySplitPaneSkin(pane));
您还可以通过 -fx-skin
属性:
.split-pane {
-fx-skin: com.example.MySplitPaneSkin;
}
请注意,如上使用 CSS 将为样式表覆盖的 所有 SplitPane
设置皮肤(除非您更改它们的样式class).您可能希望通过为您的 SplitPane
提供 ID 并使用 #id { ... }
.
此外,查看 JavaFX 11.0.2 中的 SplitPaneSkin
实现,一个事件处理程序被添加到每个使用所有事件的分隔符。由于这是私有实现细节,因此您无法更改此行为。换句话说,即使使用上面的代码,当鼠标悬停在分隔线上方时,鼠标事件也不会冒泡到您的 BorderPane
。
另一件需要考虑的事情是 SplitPane
中的任何控件也可能会消耗鼠标事件。您需要为每个此类子控件应用与上述类似的内容。