web-dev-qa-db-fra.com

JavaFX TabPane: comment écouter les changements de sélection

Je souhaite effectuer certaines actions lorsque l'utilisateur passe d'un onglet à un autre, car j'ai conçu le formulaire avec Scene Builder. Je ne peux pas utiliser le code mentionné ici (Il a utilisé TabPaneBuilder class)

J'ai deviné que ce code fonctionnerait, mais il ne réagit pas aux changements de sélection d'onglets.

@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");
            }
        }
    }
);
11
MJafar Mash

La bonne façon d'utiliser le programme d'écoute de changement est la suivante:

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

Pourquoi le code en question n'a pas fonctionné? Je suppose que c'est parce que votre auditeur de modification écoute les modifications dans "selectionModel" au lieu de "selectedItem"


Savoir quand un onglet a été ajouté ou supprimé est un peu plus compliqué:

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

Ou en Java 8 en utilisant l'expression lambda ....

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

Je pense qu'une approche bien meilleure et plus naturelle utilise Tab.setOnSelectionChanged. Voici un petit programme complet qui implémente cette approche. Vous pouvez voir un exemple BEAUCOUP plus complet ici: http://sandsduchon.org/duchon/cs335/fx020.html

Notez que vous devez également utiliser Tab.isSelected pour réagir correctement en sélectionnant ou en désélectionnant cet onglet.

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
1
Nicholas Duchon