2015-03-02 75 views
1

是否可以将.hoverProperty()。addListener添加到HBox的所有孩子(在我的情况下按钮)?我知道我可以为每个按钮分配不同的侦听器。但是如果可以一次给所有的孩子分配一个听众,我很感兴趣。 HBox的按钮之间有15 px的间距。用JavaFX听儿童悬停

+0

这不是问题的答案,而是您想在听众中做什么?如果您只是在悬停时更改按钮的样式,则可以直接使用CSS来完成此操作,而不是使用侦听器。 – 2015-03-02 17:26:18

回答

2

只需将监听器添加到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文档,你可以如用一个鼠标监听器现在:

注意,目前的实现悬停的依赖于鼠标输入并退出事件以确定此节点是否处于悬停状态;此 意味着此功能目前仅在 带有鼠标的系统上受支持。未来的实现可能会提供支持悬停的替代手段。

+0

我的不好,我没有提到在hbox中的按钮之间有间距。但即使用户悬停在空荡荡的空间,徘徊也会触发。有没有办法排除间距也被徘徊? – Alyona 2015-03-02 16:27:32

+0

简单的解决方案就是在你面前。为每个按钮添加一个监听器。你为什么不想要那个?聆听者在进入和退出时触发。所以如果你移动按钮 - >间距 - >按钮,那么悬停在第二个按钮上永远不会触发事件。另一种方法是听取MOUSE_MOVED事件并过滤目标i。即检查它是一个按钮还是hbox。但我不知道你想达到什么目的。 – Roland 2015-03-02 16:57:37

+0

我更新了间距的代码和鼠标移动侦听器,以防万一它帮助你。 – Roland 2015-03-02 17:03:19