【问题标题】:Children's hover listening with JavaFX使用 JavaFX 进行儿童悬停聆听
【发布时间】:2015-05-02 23:37:46
【问题描述】:

是否可以将 .hoverProperty().addListener 添加到 HBox 的所有子项(在我的情况下为按钮)?我知道我可以为每个按钮分配单独的侦听器。但是我很感兴趣是否可以一次为所有孩子分配一个听众。 HBox 的按钮之间有 15 px 的间距。

【问题讨论】:

  • 不是问题的真正答案,但是您想在听众中做什么?如果您只是在悬停时更改按钮的样式,则可以直接使用 CSS 完成此操作,而根本不使用侦听器。

标签: javafx hover listener children hbox


【解决方案1】:

只需将监听器添加到 HBox:

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {

        Group root = new Group();

        HBox hBox = new HBox();
        hBox.setSpacing(30);

        for (int i = 0; i < 10; i++) {
            hBox.getChildren().add(new Button("Button " + i));
        }

        hBox.hoverProperty().addListener(new ChangeListener<Boolean>() {

            @Override
            public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
                System.out.println("Hover: " + oldValue + " -> " + newValue);
            }
        });

        hBox.addEventFilter(MouseEvent.MOUSE_ENTERED, e -> System.out.println( e));
        hBox.addEventFilter(MouseEvent.MOUSE_EXITED, e -> System.out.println( e));
        hBox.addEventFilter(MouseEvent.MOUSE_MOVED, e -> {

            if( e.getTarget() instanceof Button) {
                System.out.println( e);
            }

        });

        hBox.setMaxHeight(100);

        root.getChildren().add( hBox);
        Scene scene = new Scene( root, 800, 500);

        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

根据hoverProperty 文档,您现在也可以使用鼠标侦听器:

请注意,当前的悬停实现依赖于鼠标输入和 退出事件判断该Node是否处于悬停状态;这 表示此功能目前仅在以下系统上受支持 有一只老鼠。未来的实现可能会提供替代方法 支持悬停。

【讨论】:

  • 我的错,我没有提到 hbox 中的按钮之间有间距。但是即使用户悬停那些空白空间,悬停也会触发。有没有办法排除间距也被悬停?
  • 简单的解决方案就在您面前。为每个按钮添加一个监听器。你为什么不想要那个?侦听器在进入和退出时触发。因此,如果您移动 Button -> Spacing -> Button,则将鼠标悬停在第二个按钮上将永远不会触发事件。另一种方法是监听 MOUSE_MOVED 事件并过滤目标,即。 e.检查它是按钮还是hbox。但我不知道你想达到什么目的。
  • 我用间距和鼠标移动的监听器更新了代码,以防它帮助你。
猜你喜欢
  • 2014-11-05
  • 2015-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多