JavaFX TabPane: Как прослушать изменения выбора
Я хочу сделать некоторые действия, когда пользователь переходит с одной вкладки на другую, так как я создал свой дизайн формы с помощью Scene Builder, я не могу использовать упомянутый здесь код (он использовал TabPaneBuilder
учебный класс)
Я предполагал, что этот код будет работать, но он не реагирует на изменения выбора вкладок.
@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");
}
}
}
);
3 ответа
Правильный способ использовать слушателя изменений таков:
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() ) {
// ...
}
}
} );
Или в Java 8 с помощью лямбда-выражения....
chatTabs.getSelectionModel().selectedItemProperty().addListener((ov, oldTab, newTab) -> {
System.err.println("changed");
});
Я думаю, что намного лучший и более естественный подход использует Tab.setOnSelectionChanged. Вот полная маленькая программа, которая реализует этот подход. Вы можете увидеть МНОГО более полный пример здесь: http://sandsduchon.org/duchon/cs335/fx020.html
Обратите внимание, что вы также должны использовать Tab.isSelected, чтобы правильно реагировать на выбор этой вкладки или отмена выбора этой вкладки.
import javafx.application.Application; // FX base, requires start(Stage)
import javafx.stage.Stage; // required by start (Stage)
import javafx.scene.Scene; // no scene --> no display
import javafx.scene.control.TabPane;
import javafx.scene.control.Tab;
public class TabDemo extends Application {
public void start (Stage stage) {
TabPane tabPane = new TabPane ();
Tab tba = new Tab ("one");
Tab tbb = new Tab ("two");
tabPane.getTabs().addAll (tba, tbb);
tba.setOnSelectionChanged (e ->
System.out.println (
tba.isSelected()?
"a selected":
"a unselected"
)
);
Scene scene = new Scene (tabPane, 200, 50);
stage.setScene (scene);
stage.setTitle ("A Study of tab listeners");
stage.show ();
} // end start
} // end class TabDemo
В дополнение к ответу MJafar Mash выше вы можете использовать "selectedIndexProperty()
"получить индекс выбранной вкладки вместо"selectedItemProperty()
"который получает выбранную вкладку.
chatTabs.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number> (){
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
int selectedIndex = newValue.intValue();
//where index of the first tab is 0, while that of the second tab is 1 and so on.
}
});
И это его версия лямбда-выражения
chartTabs.getSelectionModel().selectedIndexProperty().addListener( (observable, oldValue, newValue) -> {
int selectedIndex = newValue.intValue();
//where index of the first tab is 0, while that of the second tab is 1 and so on.
});