2015-03-02 76 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