JavaFX TabPane:如何监听选择更改

java javafx listener propertychangelistener

24863 观看

4回复

2027 作者的声誉

当用户从一个选项卡转到另一个选项卡时,我想做一些操作,因为我使用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");
            }
        }
    }
);
作者: MJafar Mash 的来源 发布者: 2013 年 7 月 8 日

回应 (4)


35

2027 作者的声誉

决定

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

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() ) {
      // ...
    }
  }
} );
作者: MJafar Mash 发布者: 08.07.2013 09:17

12

474 作者的声誉

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

chatTabs.getSelectionModel().selectedItemProperty().addListener((ov, oldTab, newTab) -> {
        System.err.println("changed");
    });
作者: user3190916 发布者: 04.10.2015 08:20

1

21 作者的声誉

我认为更好更自然的方法是使用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
作者: Nicholas Duchon 发布者: 23.08.2018 01:51

0

44 作者的声誉

除了上面的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.
     }
 });

这是它的lambda表达式版本

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.
});
作者: Wilson 发布者: 09.06.2019 03:50
32x32