2013-07-08 75 views
8

我想要做一些動作,當用戶從一個標籤到另一個去,因爲我做了我的外形設計與場景生成器,我不能使用代碼中提到here(他用TabPaneBuilder類)JavaFX的TabPane:如何聽選擇改變

我猜這個代碼會工作,但它不會對標籤頁選擇的變化做出反應。

@FXML 
protected TabPane chatTabs; 
. 
.  
. 
chatTabs.selectionModelProperty().addListener(
    new ChangeListener<SingleSelectionModel<Tab>> { 
      @Override 
      public void changed(ObservableValue<? extends SingleSelectionModel<Tab>> ov, SingleSelectionModel<Tab> t, SingleSelectionModel<Tab> t1) { 
       System.err.println("changed"); 
      } 
     } 
    } 
); 

回答

21

使用更改偵聽正確的做法是這樣的:

chatTabs.getSelectionModel().selectedItemProperty().addListener(
    new ChangeListener<Tab>() { 
     @Override 
     public void changed(ObservableValue<? extends Tab> ov, Tab t, Tab t1) { 
      System.out.println("Tab Selection changed"); 
     } 
    } 
); 

爲什麼有問題的代碼沒有工作?我想它的,因爲你的變化聽衆收聽變化「selectionModel」而不是「selectedItem


找出當標籤已被添加或刪除有點麻煩:

tabs.addListener((Change<? extends Tab> change) -> { 
    while(change.next()) { 
    if(change.wasAdded()) { 
     for(final Tab tab : change.getAddedSubList()) { 
     System.out.println("Tab Added: " + tab); 
     } 
    } else if(change.wasRemoved()) { 
     // ... 
    } 
    } 
}); 
6

還是在Java 8使用lambda表達式....

chatTabs.getSelectionModel().selectedItemProperty().addListener((ov, oldTab, newTab) -> { 
     System.err.println("changed"); 
    });