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

答案 1

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

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

为什么有问题的代码不起作用?我猜这是因为您的更改侦听器侦听“”而不是”selectionModelselectedItem"


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

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() ) {
      // ...
    }
  }
} );

答案 2

或者在Java 8中使用lambda表达式....

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

推荐