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

Composants Java Discussion :

[JTable][DefaultCellEditor] Principe ?


Sujet :

Composants Java

  1. #1
    Membre régulier Avatar de spoutyoyo
    Inscrit en
    Avril 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 116
    Points : 83
    Points
    83
    Par défaut [JTable][DefaultCellEditor] Principe ?
    Bonjour,

    Mon probléme est le suivant:
    Je voudrais avoir dans les cellules de la colonne 1 de ma JTable, un bouton et label. Le clic sur le bouton doit me permettre de saisir une date, qui elle s'affiche grace au label.

    J'ai donc défini un Editor en plus de mon Model et de mon Renderer.

    J'ai créé un panel qui contient le bouton et le label, lequel est "positionné" dans mes cellules. J'arrive a cliquer sur le bouton, selectionner une date et l'afficher dans le label. Mais mon pb est que la valeur n'est pas enregistré dans mon model (setValueAt)...

    J'aimerais savoir un peu plus sur le fonctionnement des Editors, mais surtout la différence entre getTableCellEditorComponent et getCellEditorValue (méthode redéfini de DefaultCellEdior dans mon Editor).

    Merci
    http://www.stop-monsanto.qsdf.org/

  2. #2
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Pour une JTable seul le getTableCellEditorComponent est utilise..
    Il te retourne le composant que la JTable va montrer pour editer la valeur de la cellule..

    Je crois que c'est a toi de mettre a jour le modele lorsque l'edition est finie...

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  3. #3
    Membre régulier Avatar de spoutyoyo
    Inscrit en
    Avril 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 116
    Points : 83
    Points
    83
    Par défaut
    Je retourne mon panel dans getTableCellEditorComponent.
    Le pb est que:
    l'action du bouton (qui setText le label avec la date choisi par l'utilisateur) se fait après l'appel a getTableCelleEditorComponent.
    Donc on a bien la bonne date qui est affiché, mais l'objet Value (qui est la date) qui "voyage" entre le model, le renderer et l'editor n'est pas la nouvelle valeur, il s'agit de celle déjà présente.

    En gros, il y a toujours un tour de retard .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public java.awt.Component getTableCellEditorComponent(javax.swing.JTable table, Object value,
        boolean isSelected, int row, int column) {
            try{
                java.util.Date creneau = (java.util.Date)value;
                java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd MMMMM yy");
                panel.getLabel().setText(sdf.format(creneau));
                panel.getLabel().setFont(new java.awt.Font("Dialog", java.awt.Font.PLAIN, 10));
                return panel;
            }
            catch(ClassCastException ex){
                return null;
            }
        }
    l'objet creneau est la date qui est déjà enregistrée. Initialement la date retournée par le getValueAt de mon model. C'est après que l'action du bouton est réalisé, et dc pb :/
    http://www.stop-monsanto.qsdf.org/

  4. #4
    Membre régulier Avatar de spoutyoyo
    Inscrit en
    Avril 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 116
    Points : 83
    Points
    83
    Par défaut
    Je retourne mon panel dans getTableCellEditorComponent.
    Le pb est que:
    l'action du bouton (qui setText le label avec la date choisi par l'utilisateur) se fait après l'appel a getTableCelleEditorComponent.
    Donc on a bien la bonne date qui est affiché, mais l'objet Value (qui est la date) qui "voyage" entre le model, le renderer et l'editor n'est pas la nouvelle valeur, il s'agit de celle déjà présente.

    En gros, il y a toujours un tour de retard .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public java.awt.Component getTableCellEditorComponent(javax.swing.JTable table, Object value,
        boolean isSelected, int row, int column) {
            try{
                java.util.Date creneau = (java.util.Date)value;
                java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd MMMMM yy");
                panel.getLabel().setText(sdf.format(creneau));
                panel.getLabel().setFont(new java.awt.Font("Dialog", java.awt.Font.PLAIN, 10));
                return panel;
            }
            catch(ClassCastException ex){
                return null;
            }
        }
    l'objet creneau est la date qui est déjà enregistrée. Initialement la date retournée par le getValueAt de mon model. C'est après que l'action du bouton est réalisé, et dc pb :/
    http://www.stop-monsanto.qsdf.org/

  5. #5
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Je suis perdu la ..

    Ton bouton il est bien dans le panel retourne par la methode getTableCellEditorComponent

    Ce bouton il ouvre une autre fenetre c'est bien ca :

    Dans ce cas ce que tu peux faire c'est a la fermeture de la fenetre tu fais un setValueAt de la nouvelle valeur et tu envoie un evt a la table pour lui indiquer que cette valeur a change..
    Il y a tout ce qu'il faut dans la classe AbstractTableModel ...

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  6. #6
    Membre régulier Avatar de spoutyoyo
    Inscrit en
    Avril 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 116
    Points : 83
    Points
    83
    Par défaut
    C'est une solution, mais mon panel doit être indépendant de son utilisation, il ne devrait pas connaitre la JTable...

    Pour mieux comprendre le fonctionnement, rien de tel qu'un schéma

    1.label -> 08/06/2004
    2. clic sur le bouton
    3. appel a getTableCellEditorComponent(value = 08/06/2004)
    4. mis a jour du label avec value => label devient 08/06/2004
    5. actionPerformed du bouton
    5.1 choix d'une date -> 10/06/2004
    5.2 label.setText(10/06/2004)

    A aucun moment, il enregistre alors la bonne date...

    Mais vu que je connais pas bien les editors et ben jsuis perdu.
    http://www.stop-monsanto.qsdf.org/

  7. #7
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Ce que tu peux faire dans ce cas c'est modifier ton objet Date ...
    Une fois que tu as la nouvelle date tu fais un setTime sur l'objet value de l'Editor cela devrait faire la blague..

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  8. #8
    Membre régulier Avatar de spoutyoyo
    Inscrit en
    Avril 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 116
    Points : 83
    Points
    83
    Par défaut
    Je viens d'essayer, mais le comportement reste identique.

    Je viens de voir qu'il n'y pas de setValueAt appelé...donc la date ne peut pas être sauvegardée dans le model.
    C'est seulement en cliquant sur le label qu'il fait un getCellEditorValue et un setValueAt.
    Le probléme de getTableCellEditorComponent c'est qu'il n,e fait pas de setValueAt :-(
    http://www.stop-monsanto.qsdf.org/

  9. #9
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    C'est ce que j'avais dit, par contre le setTime sur l'objet Date devrait fonctionner, essaye de faire un cellEditingStopped lorsque l'edition est finie ou clique dans une autre cellule pour valider le changement ..

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  10. #10
    Membre régulier Avatar de spoutyoyo
    Inscrit en
    Avril 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 116
    Points : 83
    Points
    83
    Par défaut
    Jvais partir sur cette solution là alors...mais je trouve dommage que ce soit pas plus simple et plus propre d'utiliser les editors.

    Donc faut faire obligatoirement un clic sur la cellule pour prendre en compte le changement.

    Merci
    http://www.stop-monsanto.qsdf.org/

  11. #11
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Pas forcement, tu peux appeler toi meme cellEditingStopped lorsque tu sais que ton edition est finie..

    Les JTables fonctionnent comme ca, une cellule reste en edition jusqu'a ce qu'une autre soit choisie ou un appui sur Entree (je ne sais pas si ca le fait avec un Editor)..

    Faut dire aussi que tu te complique la vie en ecrivant un Editor mais en t'interdisant de controler le model depuis celui-ci ..

    Moi je ferais le setValueAt a la fin de l'actionPerformed du bouton de l'editor et basta, cela n'a rien de sale au niveau du design, ca respecte meme le modele MVC..

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  12. #12
    Membre régulier Avatar de spoutyoyo
    Inscrit en
    Avril 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 116
    Points : 83
    Points
    83
    Par défaut
    Comment fait-on pour simuler le clic sur une cellule?
    http://www.stop-monsanto.qsdf.org/

  13. #13
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Alors ca c'est de la solution degeu

    un appel a cellEditingStopped a le meme effet (3eme fois) que de cliquer sur une autre cellule

    Enfin voila, j'ai epuise mes batteries, tu as toutes les infos, bonne chance...

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  14. #14
    Membre régulier Avatar de spoutyoyo
    Inscrit en
    Avril 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 116
    Points : 83
    Points
    83
    Par défaut
    Pour revenir a l'action performed du bouton et du setValueAt, c sale car j'ai créé une classe qui extend de JPanel et qui regroupe mon label et mon bouton. Le panel est passé en paramétre à l'éditor, et donc le panel ne connait pas l'editor et encore moins le model. Il ne doit pas faire un appel a setValueAt.
    http://www.stop-monsanto.qsdf.org/

  15. #15
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    C'est pas de ma faute si il manque une methode a ton panel

    Si tu regardes getTableCellEditorComponent, tu verras un argument de type JTable, c'est bien la preuve que ca a pas grand sens de faire un editor qui ignore tout de la table non :

    Pourquoi ne pas passer a ton panel les parametres qu'il faut ?
    Comme ca tu peux faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    table.getModel().setValueAt(...);
    Enfin, la balle est dans ton camp ..

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

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

Discussions similaires

  1. JTable DefaultCelleditor commun
    Par rupteur dans le forum Composants
    Réponses: 2
    Dernier message: 08/01/2010, 09h26
  2. Réponses: 11
    Dernier message: 28/02/2007, 12h18
  3. [SWING]jTable + Focus
    Par chady dans le forum Composants
    Réponses: 5
    Dernier message: 27/02/2003, 14h51
  4. JBuilder7 & JTable Colonne alignement
    Par Tonton Luc dans le forum JBuilder
    Réponses: 5
    Dernier message: 06/11/2002, 17h32
  5. Réponses: 9
    Dernier message: 12/08/2002, 07h38

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