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] changer les couleurs sur un double clique


Sujet :

Composants Java

  1. #1
    Membre du Club Avatar de lkryss
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 92
    Points : 49
    Points
    49
    Par défaut [jTable] changer les couleurs sur un double clique
    bonjour
    apres avoir examiné tout les post concernant la modification des couleurs d'une lignes je n'arrive pas à résoudre mon problème :

    j'affiche une Jtable et je voudrais pouvoir changer la couleur de differentes lignes en double cliquant dessus, mais il ne se passe rien ! je ne pense pas avori compris toutes les subtilités...
    Je définie donc un tableCellRenderer que j'appel lors d'un double clique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public void mouseClicked(MouseEvent m) {
    		if (m.getClickCount() == 2) {
                            jTable2.setDefaultRenderer(Color.class, new ColorRenderer());
    	}
        }
    la mon code pour le cellrenderer :

    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
     
    class ColorRenderer extends DefaultTableCellRenderer {
     
         private static final long serialVersionUID = 1L;
     
         public ColorRenderer() {
          super();
            }
     
         public Component getTableCellRendererComponent(JTable table, Object color, boolean isSelected, boolean hasFocus,int row, int column) {
     
          Component comp = super.getTableCellRendererComponent(table, color, isSelected, hasFocus, row, column);
     
               setBackground(Color.RED); 
     
     
          return this;
         }
        }
    mais il n'y a rien qui s'affiche, j'ai essayé differentes combinaison a la place du setBackground(Color.RED); mais rien n'y fait
    (note : je ne cherche pas pour le moment a colorier toute ma ligne, mais au moins a ce qu'il se passe quelque chose lorsque je double clique dessus)
    merci d'avance pour toute aide fournie

  2. #2
    Membre expert
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Points : 3 401
    Points
    3 401
    Par défaut
    Déjà, as tu vérifier que tu as bien fait addMouseListener sur ta JTable ?
    Ensuite, si au début tu veux simplement "vérifier" que l'évenement à lui, rien de mieux qu'un System.out.println bien placé... Un pti exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public void mouseClicked(MouseEvent m) {
    		if (m.getClickCount() == 2) {
                            System.out.println("ça marche !!!!");
                            jTable2.setDefaultRenderer(Color.class, new ColorRenderer());
    	}
        }
    Comme ça, si "ça marche !!!!" s'affiche dans la console, tu peut être sur que ta méthode mouseClicked est invoqué, et que ta condition est satisfaite.
    Je te conseille quand tu commence un code nouveau et que tu n'as pas le résultat espéré de procédé ainsi : tu remontes à la source du problème (genre tu appeles la méthode operation() mais rien ne se passe), et tu fais des system.out.println(), en passant pas tous les 'noeuds' de ton code.
    Ainsi, tu sais quoi est exécuté quand !
    bonne chance !

  3. #3
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Et tu rentres dans getTableCellRendererComponent()?

    Juste au cas où, le code que t'as mis dans cette méthode, c'est temporaire? Parce que sinon, il me semble que tu vas colorier toutes les lignes de ta JTable et non pas juste une ligne...

  4. #4
    Membre du Club Avatar de lkryss
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 92
    Points : 49
    Points
    49
    Par défaut
    non en effet, je viens de m'apercevoir que je ne rentre pas dans "getTableCellRendererComponent"
    je sais que la je vais colorier toute la table comme je l'explique dans mon 1er post : "(note : je ne cherche pas pour le moment a colorier toute ma ligne, mais au moins a ce qu'il se passe quelque chose lorsque je double clique dessus)"

  5. #5
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Je pense que le problème vient du paramètre Color.class dans la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jTable2.setDefaultRenderer(Color.class, new ColorRenderer());
    Mais je vais vérifier...

    [EDIT]
    C'est bien ce qu'il me semblait : si tu fais ça, ça va appliquer ton renderer à la colonne qui contiendra des objets de type Color.
    Or j'imagine que toi tu n'as pas ce genre de colonne, tu veux juste changer le fond de ta ligne qui doit contenir des labels(?) par défaut.

  6. #6
    Membre du Club Avatar de lkryss
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 92
    Points : 49
    Points
    49
    Par défaut
    j'ai lu pas mal de post concernant ce probleme pour changer les couleurs des tuples pour les jtable, je pensais avoir a peu pres comprisle fonctionnement mais non
    le code de la classe ColorRenderer est un copier collé de l'un de ces post

  7. #7
    Membre du Club Avatar de lkryss
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 92
    Points : 49
    Points
    49
    Par défaut
    ma jtable contient des labels (string?) et des jcheckbox

    edit :
    yes ca marche ^^
    en remplacant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    jTable2.setDefaultRenderer(Color.class, new ColorRenderer());
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    jTable2.setDefaultRenderer(String.class, new ColorRenderer());
    mes lignes se colorient en rouge
    il ne me reste plus qu'a modifier mon code pour ne colorier que la ligne qui m'interesse
    merci a toi seiryujay

    (je ne close pas le sujet si a tout hasard je galere pour ne colorier qu'une ligne )

  8. #8
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    En fait, le rôle de la méthode setDefaultRenderer(Class, TableCellRenderer) c'est :
    Set the renderer used, by default, for all cells in all columns that return objects of the specified type.
    Donc ça ne fera pas ce que tu veux.
    Il faut passer par une autre méthode, et je cherche laquelle...

  9. #9
    Membre du Club Avatar de lkryss
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 92
    Points : 49
    Points
    49
    Par défaut
    avec l'aide du post
    [thread]
    http://www.developpez.net/forums/sho...jtable+couleur
    [/thread]
    je vois comment ne colorier qu'une ligne mais pas de maniere dynamique, je ne vois pas comment envoyer en parametre le ligne a colorier en fonction de mon double clique

  10. #10
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Je pense que tu vas devoir créer une classe dérivant de JTable redéfinir sa méthode paintComponent() dans le style :

    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
     
    public class MaTable extends JTable {
        // liste des lignes que tu doit "colorier"
        protected ArrayList linesToPaint;
        [...]
     
        public MaTable() {
            linesToPaint = new ArrayList(0);
            [...]
     
            // sur le double-clic, tu ajoutes la ligne sélectionnée à ton ArryList
            addMouseListener(new MouseListener() {
                public void mouseClicked(MouseEvent m) {
                    tableMouseClicked(m);
                }
            });
        }
     
        protected tableMouseClicked(MouseEvent m) {
            if (m.getClickCount() == 2) {
                System.out.println("ça marche !!!!");
                linesToPaint.add(new Integer(getSelectedRow()));
            }
        }
     
        protected void paintComponent(Graphics g){ 
            // Parcours de ton ArrayList pour savoir quelles lignes doivent être colorier et application de ton background => je te laisse l'implémenter ;) 
            [...]
     
            // dessin classique de ta JTable   
            setOpaque(false); // trick not to paint background 
            super.paintComponent(g); 
            setOpaque(true); 
        } 
    }

  11. #11
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Ou alors, peut-être, en définissant ton renderer de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jTable2.setDefaultRenderer(Object.class, new ColorRenderer());
    Là, tu appliques le CellRenderer à toute ta table...

    Après, il faut définir comment tu affectes la couleur à la/aux ligne(s) choisie(s).
    Avec un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
             public Component getTableCellRendererComponent(JTable table,Object value,
                 boolean isSelected,boolean hasFocus,int row,int column) {
                 JLabel label = (JLabel) super.getTableCellRendererComponent(table,value,isSelected,
                 hasFocus,row,column);
     
                 // Coloriage de la cellule si elle appartient à une des lignes sur lesquelles on a double-cliqué
                 if (linesToPaint.contains(new Integer(row))) {
                              label.setBackground(Color.RED);
                 }
     
                 return label;
             }
    en conservant le principe de l'ArrayList...

  12. #12
    Membre du Club Avatar de lkryss
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 92
    Points : 49
    Points
    49
    Par défaut
    pour l'application de la couleur c'est bon, juste String.color est suffisant, c'est uen table dont je me reservierai mais sans certaine colonnes.

    Après, il faut définir comment tu affectes la couleur à la/aux ligne(s) choisie(s).
    oui plus que ca a faire etj'aurais fini la partie graphique... ou presque

    donc tu me conseille une nouvelle classe?
    gggrrrr ca ferait la 3eme pour a implementer pour une Jtable
    pourquoi tant de haine?

  13. #13
    Membre du Club Avatar de lkryss
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 92
    Points : 49
    Points
    49
    Par défaut
    je ne comprend pas bien l'interet de l'arraylist en fait. a quoi cela me sert il de stocker les lignes que je dosi colorier si je souhaite qu'elle se colorient des que je clique dessus?

  14. #14
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Citation Envoyé par lkryss
    je ne comprend pas bien l'interet de l'arraylist en fait. a quoi cela me sert il de stocker les lignes que je dosi colorier si je souhaite qu'elle se colorient des que je clique dessus?
    Le problème, c'est qu'il faut que tu saches sur quelle ligne tu as double-cliqué.
    A la limite, si tu veux que tes lignes double-cliquées restent toujours en rouge, tu peux ne stocker que le numéro de la dernière ligne sur laquelle tu as double-cliqué, et tu fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
             public Component getTableCellRendererComponent(JTable table,Object value,
                 boolean isSelected,boolean hasFocus,int row,int column) {
                 JLabel label = (JLabel) super.getTableCellRendererComponent(table,value,isSelected,
                 hasFocus,row,column);
     
                 // Coloriage de la cellule si elle appartient à une des lignes sur lesquelles on a double-cliqué
                 if (row == indexDeLaDerniereLigneDoubleCliquee) {
                              label.setBackground(Color.RED);
                 }
     
                 return label;
             }
    où tu affectes indexDeLaDerniereLigneDoubleCliquee à chaque double-clic.

    Normalement, ça devrait marcher...

  15. #15
    Membre du Club Avatar de lkryss
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 92
    Points : 49
    Points
    49
    Par défaut
    je me suis peut etre mal expliqué, mais en fait c'est bien ca que je cherche a faire :
    si tu veux que tes lignes double-cliquées restent toujours en rouge
    ma jtable contient en fait une liste de chose a realiser venant d'une bdd, et le fait de mettre en rouge ma ligne indique que ce qui est a faire est urgent, donc quand j'affiche ma jtable je sais ce qui est important ou non (vu que je stocke dans ma bdd si un element est important ou non)

    sinon tout mon tableau reste rouge avec ta derniere solution

    il se passe quelque chose d'etrange aussi. j'ai mis un System.out.println("truc")
    dans getTableCellRendererComponent() et apres avoir double cliqué au moins 1 fois, il suffit que je fasse derouler ma table pour que le System.out.println("truc") reaparaisse, or je ne suis pas sensé rentré a nouveau dans getTableCellRendererComponent() etant donné que je ne fais pas d'autres double clique, si?

  16. #16
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Tu rentres dans cette méthode à chaque fois que l'affichage de table est mis à jour.
    Comment affectes-tu la varaible indexDeLaDerniereLigneDoubleCliquee?

    PS : j'espère que t'as changé ce nom

  17. #17
    Membre du Club Avatar de lkryss
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 92
    Points : 49
    Points
    49
    Par défaut
    Non pour me souvenir que tu m'as aidé j'ai gardé le meme nom
    je l'affecte ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public void mouseClicked(MouseEvent m) {
    		if (m.getClickCount() == 2) {
    			System.out.println("bobobob");
                            int indexDeLaDerniereLigneDoubleCliquee = jTable2.getSelectedRow();;
                            this.indexDeLaDerniereLigneDoubleCliquee = indexDeLaDerniereLigneDoubleCliquee;
                            jTable2.setDefaultRenderer(String.class, new ColorRenderer());
    	}
        }
    et je sais avec le debugger que indexDeLaDerniereLigneDoubleCliquee contient bien la bonne valeur de ma ligne

    ce qui me donne ca apres :
    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
     
    class ColorRenderer extends DefaultTableCellRenderer {
     
         public ColorRenderer() {
          super();
            }
     
         public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row, int column) {
     
          Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
          System.out.println("fdiojfdspjfdsjfds");
          JLabel label = (JLabel) super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column);
          if (row == indexDeLaDerniereLigneDoubleCliquee) {
                              setBackground(Color.RED);
                 }
          return label;
         }
        }

  18. #18
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Et t'as repris le code que j'ai posté? C'est bizarre...
    C'est tout rouge dès le départ ou à partir de ton premier double-clic?

  19. #19
    Membre du Club Avatar de lkryss
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 92
    Points : 49
    Points
    49
    Par défaut
    c'est tout rouge apres mon 1er double clique, ce qui est normal puisque j'appel mon changement de couleur avec public void mouseClicked(MouseEvent m)

  20. #20
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Essaie de faire Et si ça ne marche pas, rajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    juste avant le

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Changer la couleur sur clique d'un onglet dans un menu
    Par nadiaflamingenierie dans le forum Général JavaScript
    Réponses: 44
    Dernier message: 18/04/2008, 15h56
  2. Aide pour changer de couleur sur les primitifs GLUT
    Par romainhoarau2764 dans le forum GLUT
    Réponses: 3
    Dernier message: 19/03/2005, 13h30
  3. [JTable] Changer les données
    Par norkius dans le forum Composants
    Réponses: 12
    Dernier message: 27/01/2005, 14h51
  4. [Forms] changer les couleurs
    Par Nounoursonne dans le forum Forms
    Réponses: 11
    Dernier message: 02/04/2004, 09h40
  5. Changer les couleurs de la palette avec du RGB
    Par le mage tophinus dans le forum x86 16-bits
    Réponses: 11
    Dernier message: 13/01/2003, 08h55

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