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 :

Colonne de CheckBox sans propriété dédiée


Sujet :

JavaFX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Ingénieur Recherche
    Inscrit en
    Octobre 2014
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Ingénieur Recherche

    Informations forums :
    Inscription : Octobre 2014
    Messages : 69
    Par défaut Colonne de CheckBox sans propriété dédiée
    Bonjour,
    j'ai un soucis dans une TableView pour laquelle j'essaye de créer une colonne de CheckBox. Le fait d'être coché ou pas est fonction de l'objet de la ligne, mais ne renvoie pas à une propriété de la classe. Voici mon 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
    //Créer la table
    table = new TableView<Trans>();
    TableColumn<Trans, Trans> newColString = new TableColumn<Trans, String>("Name");
    newColString.setCellValueFactory(new PropertyValueFactory<>("name"));
    table.getColumns().add(newColString);
    //Créer la colonne
    TableColumn<Trans, Boolean> booleanColumn = new TableColumn<Trans, Boolean>("test checkbox");
    //En faire une colonne de checkBox
    booleanColumn.setCellFactory(CheckBoxTableCell.forTableColumn(booleanColumn));
    //Attribuer le fait d'être cocher ou pas
    booleanColumn.setCellValueFactory(param  -> {
    	Trans trans = param.getValue();
    	Boolean value = false;
    	if (param.getName() == ""){
    		System.out.println(param.getName()+"\t"+true);
    		return new ReadOnlyObjectWrapper<Boolean>(true);
    	}else{
    		System.out.println(param.getName()+"\t"+true);
    		return new ReadOnlyObjectWrapper<Boolean>(false);
    	}
    });
    /Permettre de cocher ou de décocher
    booleanColumn.setEditable(true);
    //Ajouter la colonne
    table.getColumns().add(booleanColumn);
    Mon principal problème est que les cases ne sont pas cochées lorsque la valeur retournée est true.
    Mon autre problème (moins important) est que je ne parvient pas à cocher ou décocher malgré le setEditable à true. Probablement lié au ReadOnlyObjectWrapper, mais je ne sais pas comment créer une ObservableValue<Boolean>. C'est moins important cependant.
    Auriez-vous des pistes pour moi?

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    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 901
    Billets dans le blog
    54
    Par défaut
    1. La comparaison entre String ca ne se fait pas avec == mais avec la méthode equals().
    2. Essaie avec une SimpleObjectProperty<Boolean> et surtout avant de la retourner met dessus un listener pour forwarder ses changements d'état à l'objet source.
    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é
    Femme Profil pro
    Ingénieur Recherche
    Inscrit en
    Octobre 2014
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Ingénieur Recherche

    Informations forums :
    Inscription : Octobre 2014
    Messages : 69
    Par défaut
    Merci pour le SimpleObjectProperty! Je ne peux toujours pas cocher ou décocher moi-même cependant.
    et surtout avant de la retourner met dessus un listener pour forwarder ses changements d'état à l'objet source
    Hum... tu veux dire quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //Attribuer le fait d'être cocher ou pas
    booleanColumn.setCellValueFactory(param  -> {
    	Trans trans = param.getValue();
    	Boolean value = false;
    	if (param.toString()equals("")){
    		Mettre un listener ici
    		return new ReadOnlyObjectWrapper<Boolean>(true);
    	}else{
    		Mettre un listener ici
    		return new ReadOnlyObjectWrapper<Boolean>(false);
    	}
    });
    je ne suis pas sûre de comment procéder. Il me semblait que setCellValueFactory permettait justement d'écouter les changement? Lorsque je supprime le côté checkBox, cela renvoie une colonne avec écrit true ou false aux endroit appropriés...

  4. #4
    Membre confirmé
    Femme Profil pro
    Ingénieur Recherche
    Inscrit en
    Octobre 2014
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Ingénieur Recherche

    Informations forums :
    Inscription : Octobre 2014
    Messages : 69
    Par défaut
    Après quelque jours de recherche, je suis toujours au point mort.
    Pour le moment, j'ai fais une colonne String qui affiche "true" ou "false" et que je modifie en tapant.
    C'est très loin d'être idéal, mais ça me permet de passer à autre chose.
    En attendant, si quelqu'un a une idée, ça m'intéresse beaucoup.

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    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 901
    Billets dans le blog
    54
    Par défaut
    Pas eut des masses de temps pour moi-meme ces derniers jours et il y avait des bugs dans le code qui m’empêchaient de le compiler / tester direct donc pas trop envie de me pencher dessus.

    Hum, déjà il semble y avoir un bug lorsqu'on utilise un ReadOnlyObjectWrapper ou un SimpleObjectProperty mais ça fonctionne lorsqu'on utilise un ReadOnlyBooleanWrapper ou un SimpleBooleanWrapper.

    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
            //Créer la colonne
            TableColumn<Trans, Boolean> booleanColumn = new TableColumn<>("test checkbox");
            //En faire une colonne de checkBox
            booleanColumn.setCellFactory(CheckBoxTableCell.forTableColumn(booleanColumn));
            //Attribuer le fait d'être cocher ou pas
            booleanColumn.setCellValueFactory(param -> {
                final Trans trans = param.getValue();
                final boolean value = "".equals(trans.getName());
                System.out.println(trans.getName() + "\t" + value);
                // Bug ?!
    //             return new ReadOnlyObjectWrapper<>(value);
    //             return new SimpleObjectProperty<>(value);
                // Ok.  
    //            return new ReadOnlyBooleanWrapper(value);
                return new SimpleBooleanProperty(value);
            });
    Ou alors c'est normal et il faut utiliser la méthode de fabrique de CheckBoxTableCell qui prend un convertisseur en argument.

    Vu que du dois cocher la case en fonction du nom de l'objet, de toute façon, je propose plutôt de faire comme suit :

    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
            //Créer la table
            table = new TableView<>();
            table.setEditable(true);
            TableColumn<Trans, String> newColString = new TableColumn<>("Name");
            newColString.setEditable(true);
            newColString.setCellValueFactory(new PropertyValueFactory<>("name"));
            newColString.setCellFactory(TextFieldTableCell.forTableColumn());
            table.getColumns().add(newColString);
    //        //Créer la colonne
    //        TableColumn<Trans, Boolean> booleanColumn = new TableColumn<Trans, Boolean>("test checkbox");
    //        //En faire une colonne de checkBox
    //        booleanColumn.setCellFactory(CheckBoxTableCell.forTableColumn(booleanColumn));
    //        //Attribuer le fait d'être cocher ou pas
    //        booleanColumn.setCellValueFactory(param -> {
    //            final Trans trans = param.getValue();
    //            final boolean value = "".equals(trans.getName());
    //            System.out.println(trans.getName() + "\t" + value);
    //            // Bug ?!
    ////             return new ReadOnlyObjectWrapper<>(value);
    ////             return new SimpleObjectProperty<>(value);
    //            // Ok.  
    ////            return new ReadOnlyBooleanWrapper(value);
    //            return new SimpleBooleanProperty(value);
    //        });
            //Créer la colonne
            final TableColumn<Trans, String> booleanColumn = new TableColumn<>("test checkbox");
            booleanColumn.setCellValueFactory(new PropertyValueFactory<>("name"));
            //En faire une colonne de checkBox
            booleanColumn.setCellFactory(CheckBoxTableCell.forTableColumn(new Callback<Integer, ObservableValue<Boolean>>() {
                @Override
                public ObservableValue<Boolean> call(Integer param) {
                    final ObservableValue<String> valueInTable = booleanColumn.getCellObservableValue(param);
                    final boolean value = "".equals(valueInTable.getValue());
                    return new SimpleBooleanProperty(value);
                }
            }));
            // 
            //Ajouter la colonne
            table.getColumns().add(booleanColumn);
    Ici la colonne de checkbox n'est pas éditable mais la colonne de nom l'est (on a remplace la cell par défaut par une cell qui supporte l’édition). Et éditer, ajouter ou supprimer la valeur du nom provoquera le changement d’état de la checkbox.
    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

  6. #6
    Membre confirmé
    Femme Profil pro
    Ingénieur Recherche
    Inscrit en
    Octobre 2014
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Ingénieur Recherche

    Informations forums :
    Inscription : Octobre 2014
    Messages : 69
    Par défaut
    Merci beaucoup bouye, ta première solution fonctionne!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            //Créer la colonne
            TableColumn<Trans, Boolean> booleanColumn = new TableColumn<>("test checkbox");
            //En faire une colonne de checkBox
            booleanColumn.setCellFactory(CheckBoxTableCell.forTableColumn(booleanColumn));
            //Attribuer le fait d'être cocher ou pas
            booleanColumn.setCellValueFactory(param -> {
                final Trans trans = param.getValue();
                final boolean value = maFonctionTest(trans);
                return new SimpleBooleanProperty(value);
            });
    je suppose que le problème venait de comment je renvoyait la valeur booléenne...
    Pour ce qui est de l'édition, c'est résolu aussi. La colonne était éditable mais pas le tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    table.setEditable(true);
    booleanColumn.setEditable(true);
    En tout cas merci beaucoup!

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

Discussions similaires

  1. Rendre non modifiable une checkbox sans passer par la propriété isEnable
    Par jubourbon dans le forum Windows Presentation Foundation
    Réponses: 9
    Dernier message: 08/08/2013, 09h09
  2. [JTable] ajouter une colonne de checkbox
    Par nawel dans le forum Composants
    Réponses: 3
    Dernier message: 04/05/2005, 14h07
  3. tableau avec 1 colonne sur 3 sans cadre
    Par brasco06 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 9
    Dernier message: 21/04/2005, 17h44
  4. Réponses: 4
    Dernier message: 09/02/2005, 10h44
  5. [VB.NET] Insérer une colonne de CheckBox dans un DataGrid
    Par Manue.35 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 22/05/2003, 11h44

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