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

AWT/Swing Java Discussion :

[TableCellRenderer] Mettre un fond différent suivant les lignes d'un tableau


Sujet :

AWT/Swing Java

  1. #1
    Membre actif Avatar de Vikisme
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2007
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2007
    Messages : 172
    Points : 228
    Points
    228
    Par défaut [TableCellRenderer] Mettre un fond différent suivant les lignes d'un tableau
    Bonjour,

    J'ai recherché pour savoir la manière dont il fallait procédé pour obtenir un JTable (JXTable pour être précis) avec des lignes de couleurs différente si elles sont éditable ou non. J'ai trouvé une solution qui semblerait être la bonne, seulement cela ne marche pas...

    J'ai créé un TableCellRenderer et surchargé la méthode getTableCellRendererComponent(), et ensuite affecté mon modèle à mon tableau, voici le code :

    TableCellRenderer :
    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
    public class MyTableCellRenderer extends DefaultTableCellRenderer {
     
        /**
         * Numéro de version pour sérialisation
         */
        private static final long serialVersionUID = -6792822905989381648L;
     
        /* 
         * (non-Javadoc)
         * @see javax.swing.table.DefaultTableCellRenderer#getTableCellRendererComponent(javax.swing.JTable, java.lang.Object, boolean, boolean, int, int)
         */
        @Override
        public Component getTableCellRendererComponent(JTable table, Object obj, boolean isSelected, boolean hasFocus, int ligne, int colonne) {
    	Component composant =  super.getTableCellRendererComponent(table, obj, isSelected, hasFocus, ligne, colonne);
    	System.out.println("buh");
     
    	if (!isSelected && !hasFocus) {
    	    if (((MyTableModel) table.getModel()).isCellEditable(ligne, colonne)) {
    		composant.setBackground(Color.LIGHT_GRAY);
    	    } else {
    		composant.setBackground(Color.WHITE);
    	    }
    	}
    	return composant;
        }
    }
    L'affectation du modèle au tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableau.setDefaultRenderer(Component.class, new MyTableCellRenderer());
    En théorie ça devrait marché, mais il ne même pas dans la méthode getTableCellRendererComponent()...

    Donc la question que je me pose : Qu'est ce que j'ai mal fait ?
    Sinon, il y a pas mal de propriétés définies sur mon tableau, il y a des propriétés qui peuvent définir cette action à la place de mon TableCellRenderer ?

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Août 2007
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 156
    Points : 192
    Points
    192
    Par défaut
    Bonjour,

    le problème est lors de ton affectation, le premier paramètre de la méthode setDefaultRenderer est le type de la valeur présente dans la cellule (String, int, boolean, etc.). A partir de là si tu veux qu'il rentre dans ta méthode pour chaque cellule, je te conseille d'utiliser

    tableau.setDefaultRenderer(Object.class, new MyTableCellRenderer());

  3. #3
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Tu te loupes dans l'affectation du du renderer: en effet ton renderenr doit s'appliquées au classes des données contenues dans le modèle de ta table.

    Or je doute que tu ais mis des JComponent dans ton model.

    Utilises plutôt Object.class ou affectes ton renderer par colonnes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maTable.getColumn(int i).setCellRenderer(Renderer r)

    Ensuite vu que tu utilises une JXTable je te conseille très fort de ne pas utiliser directement des Renderers mais de passer par le mécanisme des HighLighters

    Dans ton cas il te faudra utiliser un ColorHighlighter possédant un HighlightPredicate basé sur ta propriété editable

    Là j'ai pas sous la main de quoi coder mais j'essierais de faire çà ce soir si j'en ais le temps

  4. #4
    Membre actif Avatar de Vikisme
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2007
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2007
    Messages : 172
    Points : 228
    Points
    228
    Par défaut
    Bonjour,
    Merci pour vos 2 réponses, rapides en plus

    Effectivement avec Object ça marche un peu mieux, dans les exemples que j'avais trouvé il y avait Color à la place, je m'étais dit que ça se rapprocherait plus d'un Component, mais c'est vrai qu'en y réfléchissant, ça ne peut qu'être un Object. Quoi qu'il en soit il a beau mettre le fond sur les bonnes cases, graphiquement il fait un peu n'importe quoi...

    J'viens d'essayé avec un ColorHighlighter, c'était assez simple du coup avec toutes ces informations.

    Merci encore

    Pour info dans la méthode isHighlighted(renderer, adapter) du HighlightPredicate il suffit de renvoyer adapter.isEditable()...

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

Discussions similaires

  1. [Débutant] Une css, des fonds différents suivant les pages
    Par Skyou dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 20/10/2008, 22h31
  2. Réponses: 15
    Dernier message: 19/06/2006, 19h25
  3. Réponses: 2
    Dernier message: 08/05/2006, 21h08
  4. Réponses: 8
    Dernier message: 05/05/2006, 17h47
  5. Action différente suivant les droits
    Par JMLD dans le forum XMLRAD
    Réponses: 2
    Dernier message: 27/04/2005, 17h25

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