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] Un JButton dans une cellule


Sujet :

Composants Java

  1. #1
    Membre habitué Avatar de Sarrus
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mai 2005
    Messages : 180
    Points : 138
    Points
    138
    Par défaut [JTable] Un JButton dans une cellule
    Bon ben j'ai tout dit... Je voudrais pouvoir mettre des boutons dans des cases de mon magnifique tableau

    J'ai bien compris qu'il fallait créer un JButton d'une part, puis utiliser la methode setValueAt(button,i,j) du modele du tableau, mais quand je fais ça il m'ecrit le toString du button j'ai l'impression...


    Comment faire ?

  2. #2
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Il te reste à redéfinir le renderer de la colonne dans laquelle tu veux voir s'afficher des boutons.

  3. #3
    Membre habitué Avatar de Sarrus
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mai 2005
    Messages : 180
    Points : 138
    Points
    138
    Par défaut
    d'accord, et je lui dit quoi au renderer ?

  4. #4
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    au moins ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public ButtonRenderer extends JButton implements TableCellRenderer {
     
      public Component getTableCellRendererComponent(JTable table, Object value,
                              boolean isSelected, boolean hasFocus, int row, int column) {
        // paramétrage du bouton
        ...
        return this;
      }
    }
    Il faut bien noter que le bouton n'est pas cliquable. Si tu veux aller plus loin, il faut que tu définisses également un TableCellEditor.

  5. #5
    Membre habitué Avatar de Sarrus
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mai 2005
    Messages : 180
    Points : 138
    Points
    138
    Par défaut
    C'est à dire ? Et je n'ai pas trop compris ce qu'il fallait mettre dans l'implementation de la methode getTable...

  6. #6
    Membre habitué Avatar de Sarrus
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mai 2005
    Messages : 180
    Points : 138
    Points
    138
    Par défaut
    Aidez moi siouplé, je sens que je ne suis pas loin de comprendre, mais il me manque un élément du puzzle...

    *la_unge fait les yeux doux*

  7. #7
    Membre éprouvé
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Points : 935
    Points
    935
    Par défaut
    Qu'est ce que tu ne comprend pas :

    lorsque la Jtable affiche les cellules elle appele sa methode getDefaultRenderer(java.lang.Class) pour connaitre la classe chargée du rendu de la cellule.

    sur cette instance, elle appelle la méthode getTableCellRendererComponent(...)

    dans cette méthode il faut donc que tu paramêtre le rendu de ton bouton en fonction des donnée reçues par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setText((value==null)?"":value.toString()); // affichage du contenu du bouton
    etc, etc , ...
    ensuite tu enregistre la classe dans la Jtable en utilisant setDefaultRenderer(Class columnClass,TableCellRenderer renderer).

    pour plus d'info sur le comment marche le TableCellRenderer il y a http://java.sun.com/docs/books/tutor...nts/table.html

  8. #8
    Membre habitué Avatar de Sarrus
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mai 2005
    Messages : 180
    Points : 138
    Points
    138
    Par défaut
    Moi je veux un bouton tout simple auquel je puisse attacher un actionevent dans ma case... Que dois-je mettre comme implémentation dans la methode getTableCellRendererComponent ???

    J'ai bien compris le setText, mais qu'en est il des autres parametres de la methode ? la table, les booleens, row, column ??

    Je maitrise pas tout la

  9. #9
    Membre éprouvé
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Points : 935
    Points
    935
    Par défaut
    le principe est que tu peux personnaliser à volonté l'aspect de ton bouton (lui donner un couleur en fonction de s'il a le focus ou non, s'il est selectionné ou non, en fonction de s'il est sur un ligne paire ou impaire (c'est util s'il y a beacoup de ligne..) ). c'est pourquoi sun à prévus toutes les possibilités.
    bref dans ton cas cela ne sert probablement pas (peut-être par la suite).

    pour cliquer sur ton bouton il faut (comme la dit herve91) il faut que ton ButtonRenderer implemente aussi le TableCellEditor

    ce qui te donne approximativement :
    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
    public class ButtonRenderer extends JButton implements TableCellRenderer, TableCellEditor
    {
     
        private Object value;
     
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
        {
            setText((value==null)?"":value.toString());
            return this;
        }
     
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
        {
            this.value=value;
            setText((value==null)?"":value.toString());
            addActionListener(new ActionListener()
            {
     
                public void actionPerformed(ActionEvent e)
                {
                    // mon traitement
                }
     
            });
            return this;
        }
     
        public void cancelCellEditing(){}
     
        public boolean stopCellEditing(){
            return false;
        }
     
        public Object getCellEditorValue(){
            return value;
        }
     
        public boolean isCellEditable(EventObject anEvent){
            return true;
        }
     
        public boolean shouldSelectCell(EventObject anEvent){
            return false;
        }
     
        public void addCellEditorListener(CellEditorListener l){}
     
        public void removeCellEditorListener(CellEditorListener l){}
     
    }

  10. #10
    Membre habitué Avatar de Sarrus
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mai 2005
    Messages : 180
    Points : 138
    Points
    138
    Par défaut
    Si j'ai bien compris, le actionperformed je l'implemente pas direct dans la decl. de la classe, mais lorsque j'instancie un nouveau bouton ?

  11. #11
    Membre habitué Avatar de Sarrus
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mai 2005
    Messages : 180
    Points : 138
    Points
    138
    Par défaut
    Bon, j'ai implementé la classe, et maintenant pour avoir un bouton dans mon tableau je n'ai qua faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ButtonRenderer button = new ButtonRenderer();
    button.set...
     
    defaulttablemodel.setValueAt(button,i,j);
    ???

  12. #12
    Membre éprouvé
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Points : 935
    Points
    935
    Par défaut
    que souhaite tu faires exactement comme traitement sur ton bouton?

  13. #13
    Membre habitué Avatar de Sarrus
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mai 2005
    Messages : 180
    Points : 138
    Points
    138
    Par défaut
    Je voudrais qu'il soit évidemment cliquable et dans l'actionperformed : lancer un runtime.exec pour une application externe...

  14. #14
    Membre actif

    Inscrit en
    Septembre 2004
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 108
    Points : 229
    Points
    229
    Par défaut
    Je te conseille de faire un tour à cette adresse:
    http://www.crionics.com/products/opensource/faq/swing_ex/JTableExamples2.html

    en gros,
    1- definir un renderer
    2 - definir un editor
    3- ne pas oublier de mettre dans le modele setEditale a true

  15. #15
    Membre habitué Avatar de Sarrus
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mai 2005
    Messages : 180
    Points : 138
    Points
    138
    Par défaut
    Sur quel model doit on mettre le setEditable à true ?

    J'ai maintenant le design bouton dans ma colonne, mais maintenant je n'arrive pas à afficher le texte que je veux dans ce bouton, et il n'est pas encore cliquable... J'avoue etre un peu paumée...

    En fait je ne sais pas ou parametrer mon bouton... A quel moment je lui dit button.setText("...") ? Et vu que j'ai l'impression que la declaration du bouton se fait dans la classe, comment je fais pour faire des boutons qui varient en fonction des cas (je voudrais qu'ils soient rouges sur certaines colonnes, en fonction de parametres exterieurs (à savoir des données écrites sur des fichiers txt...) Dois-je faire une classe par bouton différent ?

  16. #16
    Membre habitué Avatar de Sarrus
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mai 2005
    Messages : 180
    Points : 138
    Points
    138
    Par défaut
    Quelqu'un peut il éclairer ma lanterne ?

  17. #17
    Membre habitué Avatar de Sarrus
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mai 2005
    Messages : 180
    Points : 138
    Points
    138
    Par défaut
    Bon ca marche à peu pres, le seul probleme restant : Je ne parviens pas à configurer les boutons en fonction de la ligne, ils sont tous identiques suivant la colonne. Concretement :

    Pour une ligne i, je voudrais que le bouton s'affiche en vert ou en rouge suivant la valeur d'un champ lié à cette ligne i.

  18. #18
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    A adapter à ton cas de figure :

    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 Component getTableCellRendererComponent(JTable table, Object value, 
                              boolean isSelected, boolean hasFocus, int row, int column) { 
        // paramétrage du bouton en fonction de la ligne
        Object champParametrageCouleur =
          table.getModel().getValueAt(row, colonneParametrageCouleur);
     
        if (isRed(champParametrageCouleur)) {
          setBackground(Color.Red);
        } else if (isGreen(champParametrageCouleur)) {
          setBackground(Color.Green);
        }
     
        return this; 
      }

  19. #19
    Membre habitué Avatar de Sarrus
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mai 2005
    Messages : 180
    Points : 138
    Points
    138
    Par défaut
    Hervé, un grand merci !!! Non seulemnt j'ai reussi à faire ce quej e voulais, mais en plus j'ai enfincompris comment parametrer ces satanés boutons. J'ai pu mettre les couleurs que je veux, mettre des boutons actifs ou non en fonction de données différentes.

    Un grand merci

    Je peux avec joie cliquer sur Résolu...

  20. #20
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Citation Envoyé par la_unge
    Hervé, un grand merci !!!

    ravi d'avoir pu t'aider !

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

Discussions similaires

  1. focus dans une cellule d'une JTable
    Par coil dans le forum Composants
    Réponses: 5
    Dernier message: 07/07/2010, 17h15
  2. [JTable] Check Box dans une cellule
    Par kkajout dans le forum Composants
    Réponses: 4
    Dernier message: 19/05/2008, 10h55
  3. [JTable] rendre un JButton dans une cellule
    Par Invité dans le forum Composants
    Réponses: 9
    Dernier message: 15/03/2007, 18h16
  4. [JTable] Mettre un composant Swing dans une cellule
    Par NeptuS dans le forum Composants
    Réponses: 4
    Dernier message: 09/09/2005, 12h18
  5. [JTable] Un ScrollPane dans une cellule
    Par Colonel Renard dans le forum Composants
    Réponses: 3
    Dernier message: 25/07/2005, 16h54

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