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 :

formatage et edition d'une colonne d'un TableView


Sujet :

JavaFX

  1. #1
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 212
    Points : 184
    Points
    184
    Par défaut formatage et edition d'une colonne d'un TableView
    salut,
    j'aimerais rendre une colonne d'un tableview editable. voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
           userTable.setEditable(true);
            ...
            birthdayCol.setCellValueFactory(new PropertyValueFactory<User, LocalDate>("birthday"));
            birthdayCol.setCellFactory(TextFieldTableCell.forTableColumn(new  LocalDateStringConverter()));  
            birthdayCol.setOnEditCommit(e ->  birthdayCo_Edit(e) );
    pour formater les valeurs de cette colonne, j'utilise:
    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
     birthdayCol.setCellFactory(p -> {
                return new TableCell<User, LocalDate>() {
     
     
     
                    @Override
                    protected void updateItem(LocalDate item, boolean empty) {
                        super.updateItem(item, empty);
                        if (item == null || empty) {
                            setText(null);
     
                        } else {
                            final DateTimeFormatter format = DateTimeFormatter.ofPattern("dd/MM/yyyy");
                            setText(item.format(format));
                            if(item.isEqual(LocalDate.of(2015, 8, 13))){
                                TableRow currentRow = getTableRow();
                                currentRow.setStyle("-fx-background-color: red;");
                                //setStyle();
                            }
     
                        }
                    }
                };
            });
    tout se passe bien quand j'utilise un seul appel à la méthode setCellFactory().
    Malheureusement quand j'utilise les deux codes, le dernier appelé va masquer le premier. et çà est tout a fait logique. donc comment je puisse formater et editer une colonne d'une tableview en même temps.

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 854
    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 854
    Points : 22 878
    Points
    22 878
    Billets dans le blog
    51
    Par défaut
    Comme tu utilises une cellule customisée, c'est elle qui doit fournir l'éditeur désormais. Dans le code de ta cellule, rajoute les trois méthode suivantes :

    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
    @Override
    public void startEdit() {
        System.out.println("startEdit");
        super.startEdit();
    }
     
    @Override
    public void cancelEdit() {
        System.out.println("cancelEdit");
        super.cancelEdit();
    }
     
    @Override
    public void commitEdit(LocalDate newValue) {
        System.out.println("commitEdit -> " + newValue);
        super.commitEdit(newValue);
    }
    Quand l'édition commence (startEdit()), tu dois modifier le contenu de ta cellule pour par exemple y mettre un TextField ou un Spinner ou encore faire poper un DatePicker (le fait de passer en mode édition n'implique pas forcement que l'éditeur soit dans la cellule elle-même, tu peux très bien avoir une boite de dialogue). Il faut ensuite gérer l'édition de la date dans ce nouveau contrôle et faire ensuite que l'évent soit balancé dans la table pour que le ton birthdayCo_Edit(e) soit invoqué comme avant.

    Tu peux t'inspirer de ce que j'ai écrit ici où j'ai fait un éditeur qui fonctionne avec ColorPicker. Si tu trouves un bug ou que tu arrives à faire plus simple n'hésite pas à me dire que je modifie l'article.

  3. #3
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 212
    Points : 184
    Points
    184
    Par défaut
    Merci infiniment pour la réponse très utiles. en exploitant votre réponse, et après quelques navigations sur le Net, j'ai pu arriver à résoudre le problème. le code ci-après fonctionne correctement pour moi. n'hesiter pas a me faire part de vos remarques et de vos avis. voici 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
     birthdayCol.setCellFactory(column -> new TableCellBirthdayEdit());
     
    ...
    // La classe TableCellBirthdayEdit
    private class TableCellBirthdayEdit extends TableCell<User, LocalDate> {
     
            TextField textField = new TextField();
     
            public TableCellBirthdayEdit() {
                textField.setOnAction(evt -> processEdit());
            }
     
            private void processEdit() {
                String text = textField.getText();
                LocalDate value = LocalDate.parse(text);
                commitEdit(value);
            }
     
            @Override
            public void cancelEdit() {
                super.cancelEdit();
                setText(getItem().toString());
                setGraphic(null);
            }
     
            @Override
            public void commitEdit(LocalDate value) {
                super.commitEdit(value);
                ((User) this.getTableRow().getItem()).setBirthday(value);
                textField.setText(null);
                setGraphic(null);
            }
     
            @Override
            public void startEdit() {
                super.startEdit();
                LocalDate value = getItem();
                if (value != null) {
                    textField.setText(value.toString());
                    setGraphic(textField);
                    setText(null);
                }
            }
     
            @Override
            protected void updateItem(LocalDate item, boolean empty) {
                super.updateItem(item, empty);
                if (item == null || empty) {
                    setText(null);
     
    //            } else if (isEditing()) {
    //                setText(null);
    //                textField.setText(item.toString());
    //                setGraphic(textField);
                } else {
                    final DateTimeFormatter format = DateTimeFormatter.ofPattern("dd/MM/yyyy");
                    setText(format.format(item));
                    TableRow row = getTableRow();
                    if (item.isEqual(LocalDate.now())) {
                        row.setStyle("-fx-background-color: red;");
                    } else {
                        row.setStyle("");
                    }
     
                }
            }
     
        }
    Croyez-moi ce n'est pas assez simple que je l'imaginais.

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 854
    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 854
    Points : 22 878
    Points
    22 878
    Billets dans le blog
    51
    Par défaut
    Ça me semble bien !

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

Discussions similaires

  1. Rendre une colonne d'un TableView editable
    Par Gwenc dans le forum JavaFX
    Réponses: 4
    Dernier message: 14/05/2014, 13h54
  2. Drag and Drop sur une colonne d'un TableViewer
    Par jujujava dans le forum SWT/JFace
    Réponses: 0
    Dernier message: 06/10/2012, 09h23
  3. Réponses: 1
    Dernier message: 12/08/2010, 14h54
  4. Réponses: 0
    Dernier message: 13/02/2010, 12h19
  5. DBGrid: formatage de l'affichage d'une colonne
    Par SAca dans le forum Bases de données
    Réponses: 6
    Dernier message: 14/05/2004, 17h33

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