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 :

JXTreeTable et renderer


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 151
    Par défaut JXTreeTable et renderer
    Bonjour,

    Je dois avouer que je capitule pourtant que ce soit avec un tree ou une table c'est ultra simple ce que je cherche à faire ou alors je suis trop crevé pour ne pas avoir vu l'évidence.

    Ma tree table comporte des objets qui ont tous une méthode getColor() qui est en fait le background color de la ligne. Ainsi chaque ligne peuvent avoir des couleurs différentes.

    Voilà, j'ai honte ... c'est ce que je n'arrive pas à faire. mon Table cell renderer resemble à ça :
    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
            DefaultTableCellRenderer tableCellRenderer = new DefaultTableCellRenderer() {
                /**
                 * Overrides getTableCellRendererComponent.
                 * 
                 * {@inheritDoc}
                 * 
                 * @see javax.swing.table.DefaultTableCellRenderer#getTableCellRendererComponent(javax.swing.JTable,
                 *      java.lang.Object, boolean, boolean, int, int)
                 */
                @Override
                public Component getTableCellRendererComponent(JTable pTable, Object pValue, boolean pIsSelected,
                        boolean pHasFocus, int pRow, int pColumn) {
                    Component lComponent = super.getTableCellRendererComponent(pTable, pValue, pIsSelected, pHasFocus,
                            pRow, pColumn);
                    TreePath path = alertTreeTable.getPathForRow(pRow);
                    if (path.getLastPathComponent() instanceof AlertTreeTableNode) {
                        UIAlert alert = ((AlertTreeTableNode) path.getLastPathComponent()).getAlert();
                        lComponent.setBackground(alert.getAlertColor().getColor());
                    }
                    return lComponent;
                }
            };
            for (int i = 0; i < alertTreeTable.getColumnCount(); ++i) {
                alertTreeTable.getColumn(i).setCellRenderer(tableCellRenderer);
            }
    résultat obtenu :
    - si je sélectionne la ligne j'ai toujours la bonne couleur.
    - Si je ne la sélectionne pas, j'ai une des couleur.

    Dans tous les cas, la première colonne n'est jamais coloriée.

    Donc et d'un je n'affiche la bonne couleur que si la ligne est sélectionnée (alors que pour ce cas là je voudrais ajouter une couleur de sélection bien particulière) et de deux la première colonne n'affiche JAMAIS aucune couleur.

    pour info voilà la configuration de ma table (dans le cas d'un effet de bord):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    alertTreeTable.setAutoCreateColumnsFromModel(false); (sans ça le renderer de mon header est foutu en l air à chaque update de ma table)
     
    alertTreeTable.setColumnControlVisible(false);
    alertTreeTable.setHorizontalScrollEnabled(true);
    alertTreeTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    alertTreeTable.setEditable(false);
     
    alertTreeTable.setLeafIcon(null);
    alertTreeTable.setOpenIcon(null);
    alertTreeTable.setClosedIcon(null);
    alertTreeTable.setCollapsedIcon(TREE_COLAPSED_ICON);
    alertTreeTable.setExpandedIcon(TREE_EXPANDED_ICON);

    J'ai essayé de le faire en 2x. Appliquer un tablecellrenderer et un TreeCellRenderer (au passage j'ai maté les sources pour essayer de comprendre ce que ça fait). Je préfère pas raconter le massacre au niveau du rendu et encore plus au niveau du code (à base de copier coller du TreeCellRenderer utilisé dans le code de la JXTreeTable)

    Que ce soit dans une table classique ou dans un tree classique, ce que je cherche à faire est fait en - de 30 sec. et là j'y ai passé l'après midi ... s'il vous plait dites moi que je suis une grosse loutre et qu'il y a un truc évident à faire que je n'ai pas vu.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 151
    Par défaut
    Pour les prochains qui rencontreront le problème, le truc est simple, il suffit tout simplement de ne plus passer par les renderer comme à l'habitude mais par les Highlighter

    Dans un premier temps on se crée un higlighter spécifique comme suit :

    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
    69
    70
     private class AlertHighlighter implements Highlighter {
     
            /**
             * Overrides addChangeListener.
             * 
             * {@inheritDoc}
             * 
             * @see org.jdesktop.swingx.decorator.Highlighter#addChangeListener(javax.swing.event.ChangeListener)
             */
            public void addChangeListener(ChangeListener pListener) {
                // do Nothing
            }
     
            /**
             * Overrides getChangeListeners.
             * 
             * {@inheritDoc}
             * 
             * @see org.jdesktop.swingx.decorator.Highlighter#getChangeListeners()
             */
            public ChangeListener[] getChangeListeners() {
                // do Nothing
                return null;
            }
     
            /**
             * Overrides highlight.
             * 
             * {@inheritDoc}
             * 
             * @see org.jdesktop.swingx.decorator.Highlighter#highlight(java.awt.Component,
             *      org.jdesktop.swingx.decorator.ComponentAdapter)
             */
            public Component highlight(Component pRenderer, ComponentAdapter pAdapter) {
     
                // If row are selected don't touch to the background.
                int[] lSelectedRow = getSelectedRows();
                for (int lRowSelected : lSelectedRow) {
                    if (lRowSelected == pAdapter.row) {
                        return pRenderer;
                    }
                }
     
                // retrieve object from tree.
                TreePath lPath = getPathForRow(pAdapter.row);
                if (lPath == null) {
                    // should never happen.
                    return pRenderer;
                }
     
                // apply specific code.
                if (lPath.getLastPathComponent() instanceof AlertTreeTableNode) {
                    UIAlert lAlert = ((AlertTreeTableNode) lPath.getLastPathComponent()).getAlert();
                    pRenderer.setBackground(lAlert.getAlertColor().getColor());
                }
     
                return pRenderer;
            }
     
            /**
             * Overrides removeChangeListener.
             * 
             * {@inheritDoc}
             * 
             * @see org.jdesktop.swingx.decorator.Highlighter#removeChangeListener(javax.swing.event.ChangeListener)
             */
            public void removeChangeListener(ChangeListener pListener) {
                // do Nothing
            }
        }
    note : ma classe est une class privée de ma JXTreeTable donc la méthode getPathForRow fonctionne car c'est un JXtreeTable sinon ajouter matreetable.getPathForRow();

    ensuite ajouter mon highligter dans l'arbre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    addHighlighter(new AlertHighlighter());
    voilou

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Le cas de SwingX au niveau des renderers est un poil particulier. En effet il ne faut surtout pas redéfinir le renderer par défaut fourni pas SwingX. En fait SwingX implémente un mécanisme de Providers qui ont pour but de fournir les composants de rendu au DefaultXXXRenderer.

    Pour comprendre ce mécanisme tu peux regarder le code source des Provider fournis par défaut dans SwingX, par exemple la classe ButtonProvider qui se trouve dans le dossier org.jdesktop.swingx.renderer.

    Tu trouveras une version à jour de SwingX et de ses sources à l'adresse suivante: http://swinglabs.org/hudson/job/Swin...eekly%20Build/

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 151
    Par défaut
    merci pour le lien, je vais scruter les versions avec le plus grand intérêt

    Je jetterai un coup d'oeil également aux provider. Merci.

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

Discussions similaires

  1. JXTreeTable renderer et editor
    Par Seuub dans le forum Composants
    Réponses: 2
    Dernier message: 11/03/2013, 16h44
  2. [JXTreeTable] Un renderer différent par colonne
    Par Jose.N70 dans le forum Composants
    Réponses: 4
    Dernier message: 28/10/2011, 13h09
  3. Réponses: 2
    Dernier message: 17/06/2004, 11h00
  4. [Jtable] renderer?
    Par britou dans le forum Composants
    Réponses: 5
    Dernier message: 18/05/2004, 12h10
  5. Render to texture???
    Par sebh dans le forum OpenGL
    Réponses: 2
    Dernier message: 17/01/2004, 09h50

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