gpt4 book ai didi

JavaFX SplitPane 不会冒泡鼠标事件

转载 作者:行者123 更新时间:2023-12-02 01:39:05 27 4
gpt4 key购买 nike

我有一个BorderPane 。在此 Pane 中,我将 HBox 设置为顶部有几个控件。在中心我有e SplitPane有两个 Canvas 。我想让鼠标移动到 BorderPane当它从SplitPane冒泡时。

如果我使用 splitPane.setOnMouseMoved(...)我正确地了解了该事件。然而BorderPane.setOnMouseMoved(...)仅当鼠标悬停在顶部上时才有效(如果找到 HBox)。

看起来像SplitPane正在消耗该事件。谁能证实这一点吗?如果是这样,我该如何让偶数冒泡?请注意,当我应用过滤器时,偶数会在 BorderPane 处检测到。水平正在下降。

TIA

最佳答案

大多数(如果不是全部)皮肤实现都从 SkinBase 延伸。默认情况下消耗所有鼠标事件。您可以通过 protected consumeMouseEvents(boolean) 进行配置。方法。由于该方法受到保护,您必须对皮肤进行子类化(或使用反射)才能访问它:

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 中成为公共(public) API。如果您使用 JavaFX 8,则需要扩展内部外观类

然后您将设置 SplitPane 的外观。

SplitPane pane = ...;
pane.setSkin(new MySplitPaneSkin(pane));

还可以设置皮肤using CSS通过 -fx-skin 属性:

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

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

此外,查看 JavaFX 11.0.2 中的 SplitPaneSkin 实现,每个分隔符中添加了一个事件处理程序,该处理程序消耗所有事件。由于这是私有(private)实现细节,您无法更改此行为。换句话说,即使使用上面的代码,当鼠标位于分隔线上方时,鼠标事件也不会冒泡到 BorderPane

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

关于JavaFX SplitPane 不会冒泡鼠标事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54736344/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com