【问题标题】:JavaFX TabPane: How to listen to selection changesJavaFX TabPane:如何监听选择更改
【发布时间】:2013-07-05 13:15:06
【问题描述】:

当用户从一个选项卡转到另一个选项卡时,我想做一些操作,因为我使用 Scene Builder 进行了表单设计,所以我不能使用提到的代码 here(他使用了 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");
            }
        }
    }
);

【问题讨论】:

    标签: java javafx listener propertychangelistener


    【解决方案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");
            }
        }
    );
    

    为什么有问题的代码不起作用?我猜是因为您的更改侦听器侦听“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() ) {
          // ...
        }
      }
    } );
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        我认为更好、更自然的方法是使用 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
        

        【讨论】:

        • 注册处理程序本质上没有什么比这更好的了:相反(但有争议:)它可能被认为比选定项目上的 changeListener 更糟糕,因为前者与外部上下文的耦合更多(参考tba 加上检查实际选择状态),而旧/新选项卡都被传递到 changeListener - 并且 保证 选择一个不为空的新选项卡。
        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2013-01-02
          • 2010-09-08
          • 2017-06-29
          • 2016-10-01
          • 2019-07-26
          • 1970-01-01
          • 2015-10-18
          • 1970-01-01
          相关资源
          最近更新 更多