2013-07-08 23 views
8

voglio fare alcune azioni quando l'utente passa da una scheda all'altra, da quando ho fatto il mio disegno form con Scene Builder non posso utilizzare il codice menzionato here (Ha usato TabPaneBuilder classe)JavaFX TabPane: Come ascoltare la selezione cambiamenti

Ho pensato che questo codice avrebbe funzionato ma non reagiva alle modifiche alla selezione delle schede.

@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"); 
      } 
     } 
    } 
); 

risposta

21

Il modo giusto di usare il cambiamento ascoltatore è questo:

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"); 
     } 
    } 
); 

Perché codice in questione non ha funzionato? Credo che la sua causa la modifica ascoltatore ascolta cambiamenti in "selectionModel" invece di "selectedItem"


Scoprire quando una scheda è stato aggiunto o rimosso è un po 'più complicato:

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

O in Java 8 usando l'espressione lambda ....

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