JavaFX TabPane:如何监听选择更改

当用户从一个选项卡转到另一个选项卡时,我想做一些操作,因为我用Scene Builder进行了表单设计我不能使用这里提到的代码(他使用了TabPaneBuilder类)

我猜这个代码可以工作,但它不会对选项卡选择更改做出反应。

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

使用更改侦听器的正确方法是:

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

为什么有问题的代码不起作用? 我猜是因为你的更改侦听器侦听“ selectionModel ”而不是“ selectedItem ”中的更改


找出添加或删除选项卡的时间有点棘手:

 tabs.addListener( (Change 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中使用lambda表达式….

 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