IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaFX Discussion :

Pourquoi ai je un skin à valeur null pour mon TableView Oo


Sujet :

JavaFX

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2014
    Messages : 101
    Par défaut Pourquoi ai je un skin à valeur null pour mon TableView Oo
    Bonjour, voilà, je suis un peu perdu. Je crée un tableView à partir un fichier FXML:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    <?xml version="1.0" encoding="UTF-8"?>
     
    <?import javafx.scene.*?>
    <?import javafx.geometry.*?>
    <?import javafx.scene.control.*?>
    <?import java.lang.*?>
    <?import javafx.scene.layout.*?>
    <?import javafx.scene.control.Button?>
    <?import javafx.event.ActionEvent?>
    <BorderPane fx:id="bPane" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.SampleController">
        <top>
        <HBox>
        <padding>
             	<Insets top="10" bottom="10" left="250.0"/>
        </padding>
        	<Label fx:id="titre" text="Test CellValueFactory" prefWidth="300.0"  style="-fx-text-fill:black;-fx-font-size:23px;"/>
        	</HBox>
        </top>
        <center>
        <HBox>
        <padding>
             	<Insets top="20" bottom="20" left="100.0"/>
        </padding>
        <TableView  fx:id="userTab" prefWidth="600">
         	<columns>
                <TableColumn fx:id="nomCol" text="NOM" prefWidth="200"/>
                <TableColumn fx:id="prenomCol" text="PRENOM" prefWidth="200"/>
                <TableColumn fx:id="villeCol" text="VILLE" prefWidth="200"/>
            </columns>
         </TableView>
         </HBox>
       </center>
       <bottom>
       		<HBox>
       		<padding>
             	<Insets top="10" bottom="10" left="250.0"/>
        </padding>
       		<Button fx:id="valider" text="Action" prefWidth="300.0" onAction="#valider" />
       		</HBox>
       </bottom>
    </BorderPane>
    Lorsque je crée l'initialise et que je mets des valeurs ainsi que la mise en place d'un bouton en dessous, tout marche bien. Par contre, je souhaiterai récupérer le skin (TableViewSkin) pour ensuite pouvoir récupérer le TableHeaderRow. Néanmoins, j'obtiens toujours une valeur null pour le contenu du skin. Ci dessous, le code du contrôleur lié au fichier Fxml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
     
    package application;
     
    import java.util.Arrays;
     
    import application.models.Adresse;
    import application.models.Utilisateur;
    import javafx.beans.property.SimpleLongProperty;
    import javafx.beans.property.SimpleObjectProperty;
    import javafx.beans.property.SimpleStringProperty;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.event.ActionEvent;
    import javafx.fxml.FXML;
    import javafx.geometry.Pos;
    import javafx.scene.control.Button;
    import javafx.scene.control.Label;
    import javafx.scene.control.TableCell;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableView;
    import javafx.scene.control.cell.PropertyValueFactory;
    import javafx.scene.layout.BorderPane;
    import javafx.util.Callback;
     
    public class SampleController {
     
    	@FXML
    	private BorderPane bPane;
    	@FXML
    	private TableView<Utilisateur> userTab;
    	@FXML
    	private TableColumn<Utilisateur, SimpleStringProperty> nomCol;
    	@FXML
    	private TableColumn<Utilisateur,SimpleStringProperty> prenomCol;
    	@FXML
    	private TableColumn<Utilisateur,SimpleObjectProperty<Adresse>> villeCol;
    	@FXML
    	private Label titre;
    	@FXML
    	private Button valider;
     
     
     
    	@FXML
    	public void initialize(){
     
    		valider.setDisable(true);
    		double size = userTab.getWidth()/3;
    		nomCol.setMinWidth(size);
    		prenomCol.setMinWidth(size);
    		villeCol.setMinWidth(size);
    		titre.setAlignment(Pos.CENTER);
     
    		initialisationTableau();
     
     
     
    		Utilisateur user1 = new Utilisateur();
    		Utilisateur user2 = new Utilisateur();
    		Utilisateur user3 = new Utilisateur();
     
    		user1.setNom(new SimpleStringProperty("Durand"));
    		user2.setNom(new SimpleStringProperty("Dupont"));
    		user3.setNom(new SimpleStringProperty("Marion"));
    		user1.setPrenom(new SimpleStringProperty("Louis"));
    		user2.setPrenom(new SimpleStringProperty("Julie"));
    		user3.setPrenom(new SimpleStringProperty("Jacques"));
    		Adresse adresse1 = new Adresse();
    		Adresse adresse2 = new Adresse();
    		Adresse adresse3 = new Adresse();
    		adresse1.setCodePostal(new SimpleLongProperty(Long.valueOf(33000)));
    		adresse2.setCodePostal(new SimpleLongProperty(Long.valueOf(33000)));
    		adresse3.setCodePostal(new SimpleLongProperty(Long.valueOf(33000)));
    		adresse1.setRue(new SimpleStringProperty("1 rue du jardin public"));
    		adresse2.setRue(new SimpleStringProperty("1 cours Aristide Briand"));
    		adresse3.setRue(new SimpleStringProperty("1 rue sainte Catherine"));
    		adresse1.setVille(new SimpleStringProperty("Bordeaux"));
    		adresse2.setVille(new SimpleStringProperty("Bordeaux"));
    		adresse3.setVille(new SimpleStringProperty("Bordeaux"));
    		user1.setAdresse(new SimpleObjectProperty<Adresse>(adresse1));
    		user2.setAdresse(new SimpleObjectProperty<Adresse>(adresse2));
    		user3.setAdresse(new SimpleObjectProperty<Adresse>(adresse3));
     
    		userTab.setItems(FXCollections.observableList(Arrays.asList(user1,user2,user3)));
     
    		System.out.println(userTab.skinProperty().toString());
     
    	}
     
    	public void initialisationTableau(){
     
    		this.nomCol.setCellValueFactory(new PropertyValueFactory<Utilisateur,SimpleStringProperty>("nom"));
    		this.prenomCol.setCellValueFactory(new PropertyValueFactory<Utilisateur,SimpleStringProperty>("prenom"));
    		this.villeCol.setCellValueFactory(new PropertyValueFactory<Utilisateur,SimpleObjectProperty<Adresse>>("adresse"));
     
    		villeCol.setCellFactory(new Callback<TableColumn<Utilisateur, SimpleObjectProperty<Adresse>>, TableCell<Utilisateur, SimpleObjectProperty<Adresse>>>(){
     
    			@Override
    			public TableCell<Utilisateur, SimpleObjectProperty<Adresse>> call(TableColumn<Utilisateur, SimpleObjectProperty<Adresse>> arg0) {
     
    				TableCell<Utilisateur, SimpleObjectProperty<Adresse>> villeCell = new TableCell<Utilisateur, SimpleObjectProperty<Adresse>>(){
     
    	                @Override
    	                protected void updateItem(SimpleObjectProperty<Adresse> item, boolean empty) {
    	                    if (item != null) {
    	                        setText(item.get().getVille().get());
    	                    }
    	                }                    
    	            };               
     
    	            return villeCell; 
    			}
     
    	    });
     
     
    	}
     
    	public void valider(ActionEvent event){
    		ObservableList<Utilisateur> userListe =  userTab.getSelectionModel().getSelectedItems();
    		userListe.forEach(ee -> System.out.println(ee.getNom() + " " + ee.getPrenom()));
    	}
     
    }
    Et le résultat du System.out.println(userTab.skinProperty().toString()); est : ObjectProperty [bean: TableView[id=userTab, styleClass=table-view], name: skin, value: null]

    Auriez-vous une idée de comment je pourrai régler cela s'il vous plait ?

    Je vous remercie d'avance pour votre aide.

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 900
    Billets dans le blog
    54
    Par défaut
    Probablement parce que la skin n'est mise en place sur un contrôle que lorsque ce dernier est ajouté dans la scène et que le CSS est positionné dessus (la classe effective qui sert de skin est positionnée par le sélecteur CSS -fx-skin). Donc, tant que ceci n'est pas arrivé, le skin est null. A voir s'il est possible de mettre un écouteur (InvalidationListener ou ChangeListener) sur cette propriété et faire ce que tu veux faire lorsque le skin est chargé.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2014
    Messages : 101
    Par défaut
    Arf, pourriez-vous s'il vous plaît me donner un lien où je pourrais trouver des explications ou m'éclaircir un peu la chose s'il vous plaît, j'ai un livre mais il n'y a rien sur les skins et leur manipulation... Merci beaucoup pour votre réponse.

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2014
    Messages : 101
    Par défaut
    Bon ben merci pour la réponse. Après quelques recherches via celle-ci, j'ai fait les modifications suivantes dans mon contrôleur et j'ai réussi à modifier le menu du tableview. Ci-dessous le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
    public class SampleController extends Control{
     
    	@FXML
    	public BorderPane bPane;
    	@FXML
    	public TableView<Utilisateur> userTab;
    	@FXML
    	public TableColumn<Utilisateur, String> nomCol;
    	@FXML
    	public TableColumn<Utilisateur,String> prenomCol;
    	@FXML
    	public Label titre;
    	@FXML
    	public Button valider;
     
    	private ObservableList<Utilisateur> donnees = FXCollections.observableArrayList();
     
    	@FXML
    	public void initialize(){
     
    		double size = userTab.getWidth()/3;
    		nomCol.setMinWidth(size);
    		prenomCol.setMinWidth(size);
    		titre.setAlignment(Pos.CENTER);
    		userTab.skinProperty().set(new TableViewSkin<Utilisateur>(userTab));
    		this.nomCol.setCellValueFactory(new PropertyValueFactory<Utilisateur,String>("nom"));
    		this.prenomCol.setCellValueFactory(new PropertyValueFactory<Utilisateur,String>("prenom"));
     
     
     
     
     
    		Utilisateur user1 = new Utilisateur();
    		Utilisateur user2 = new Utilisateur();
    		Utilisateur user3 = new Utilisateur();
     
    		user1.setNom("Durand");
    		user2.setNom("Dupont");
    		user3.setNom("Marion");
    		user1.setPrenom("Louis");
    		user2.setPrenom("Julie");
    		user3.setPrenom("Jacques");
            userTab.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
            donnees.addAll(user1,user2,user3);
     
    		userTab.setItems(donnees);
     
     
    		userTab.setTableMenuButtonVisible(true);
     
     
    		ContextMenu cm = new ContextMenu();
     
            MenuItem mi = new MenuItem("Supprimer la Sélection");
     
            mi.setOnAction(new EventHandler<ActionEvent>()
            {
                @Override
                public void handle(ActionEvent e)
                {
                	ObservableList<Utilisateur> lsSel = userTab.getSelectionModel().getSelectedItems();
                	donnees.removeAll(lsSel);
                	userTab.getSelectionModel().clearSelection();
                }
            });        
     
     
            cm.getItems().add(mi);
     
    		 TableViewSkin tableSkin = (TableViewSkin) userTab.getSkin();
     
     
    	        ObservableList<Node> children = tableSkin.getChildren();
     
    	        for (int i = 0; i < children.size(); i++) {
     
    	            Node node = children.get(i);
     
    	            if (node instanceof TableHeaderRow) {
     
    	                TableHeaderRow tableHeaderRow = (TableHeaderRow) node;
     
    	                for( Node child: tableHeaderRow.getChildren()) {
    	                	System.out.println(child.getStyleClass());
    	                    if( child.getStyleClass().contains( "show-hide-columns-button")) {
     
    	                        ContextMenu columnPopupMenu = cm;
     
    	                        child.setOnMousePressed(me -> {
    	                            columnPopupMenu.show(child, Side.LEFT, 0, 0);
    	                            me.consume();
    	                        });
    	                    }
    	                }
     
    	            }
    	        }
     
    	    }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [CR 10] Définir la valeur null pour mes formules
    Par tibo894 dans le forum Formules
    Réponses: 4
    Dernier message: 09/08/2010, 10h49
  2. Insertion d'une valeur null pour une colonne
    Par bigggalll dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 24/03/2010, 15h01
  3. Valeur null pour un champ bigint
    Par bimus dans le forum Powerbuilder
    Réponses: 2
    Dernier message: 22/01/2007, 15h28
  4. donner une valeur nulle pour une liste déroulante
    Par sam01 dans le forum Langage
    Réponses: 3
    Dernier message: 15/10/2006, 15h45
  5. Réponses: 9
    Dernier message: 10/08/2004, 17h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo