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 :

[JXTreeTable] Highlighter d'une ligne


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2012
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 57
    Par défaut [JXTreeTable] Highlighter d'une ligne
    Bonjour,


    J'utilise actuellement une JXTreeTable dans laquelle il y a une colonne avec des cases à cocher. J'ai réussi à colorer mes lignes à l'aide du code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    treeTable.setHighlighters(HighlighterFactory.createAlternateStriping(new Color(250,200,191), new Color(250,250,191)));
    (la couleur des lignes alterne de façon à faciliter la lecture de l'utilisateur)
    Seulement voilà maintenant j'aimerais que lorsque qu'une ligne est cochée, elle soit recolorée dans sa couleur respective mais en plus foncé. En cherchant sur le forum et sur internet j'avais trouvé des solutions en utilisant AlternateRowHighlighter(), en surchargeant une de ses méthodes. Mais cette classe n'existe plus et je ne maîtrise pas de tout les Highlighters.

    J'aimerais également que lorsqu'une ligne est sélectionnée (avec un click de souris) celle ci ne change pas de couleur.


    En vous remerciant par avance,

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2012
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 57
    Par défaut
    J'ai réussi à trouver une solution pour les lignes cochées:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    treeTable.setHighlighters(HighlighterFactory.createAlternateStriping(new Color(250,200,191), 
                                                                                new Color(250,250,191)));
     
    ColorHighlighter hl = new ColorHighlighter(new MyHighlightPredicate(1),new Color(247,234,111),Color.black);
    ColorHighlighter hl2 = new ColorHighlighter(new MyHighlightPredicate(0),new Color(243,151,151),Color.black);
    treeTable.addHighlighter(hl);
    treeTable.addHighlighter(hl2);
    et mon MyHighlightPredicate:

    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
    private class MyHighlightPredicate implements HighlightPredicate {
            private int reste;
     
            public MyHighlightPredicate(int resteModulo){
                reste=resteModulo;
            }
     
            @Override
            public boolean isHighlighted(Component cmpnt, org.jdesktop.swingx.decorator.ComponentAdapter ca) {
                int rowIndex = ca.row;
                TreePath path = treeTable.getPathForRow(rowIndex);
                MyTreeNode row = (MyTreeNode) path.getLastPathComponent(); //MyTreeNode=DefaultMutableTreeTableNode
                return (row.isChecked() && rowIndex%2==reste); //row.isChecked() indique si la ligne est cochée
            }
        }
    Il ne reste plus qu'à trouver comment faire pour que la sélection d'une ligne (par un click) n’influe pas sur la couleur de cette dernière.


    PS: N'hésitez pas à me faire des remarques si vous connaissez une meilleure solution que celle que j'ai trouvé.

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2012
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 57
    Par défaut
    Bon, après pas mal de recherches et d'essais infructueux, j'ai fini par trouver une solution pour le SelectionBackground, bien qu'elle ne me semble pas très "propre". Si jamais personne peut me donner une meilleure solution, mon post aura au moins pour point positif qu'il servira peut être à ceux qui se retrouveront dans la même situation que moi.
    Bref fini de blablater, voici donc mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    treeTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    ListSelectionModel listSelectionModel = treeTable.getSelectionModel();        
    listSelectionModel.addListSelectionListener(new MyTableListener());
    et la classe MyTableListener:

    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
    public class MyTableListener  implements ListSelectionListener{
            @Override
            public void valueChanged(ListSelectionEvent listSelectionEvent){
                ListSelectionModel lsm = (ListSelectionModel)listSelectionEvent.getSource();
     
                if (!lsm.isSelectionEmpty()) {
                    int selectedRow = lsm.getMinSelectionIndex();
                    TreePath path = treeTable.getPathForRow(selectedRow);
                    MyTreeNode line = (MyTreeNode) path.getLastPathComponent();
                    if(line.isChecked()){
                        treeTable.setSelectionBackground(selectedRow%2==0?
                                new Color(243,151,151):
                                new Color(247,234,111));
                    }
                    else{
                        treeTable.setSelectionBackground(selectedRow%2==0?
                                new Color(250,200,191):
                                new Color(250,250,191));                            
                    }
     
                }
            }
    }
    le problème avec cette méthode c'est que si on coche/décoche une ligne déjà sélectionnée, le selection background ne se met pas à jour car on entre pas dans la méthode valueChanged du Listener. Pour palier ce problème voici donc ce que j'ai rajouté dans le setValueAt(...) de mon modèle:

    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
     public void setValueAt(Object value, Object node, int column) {
            /* On initialise une variable de type MyTreeNode à partir de l'objet
             * reçu en paramètre d'entrée */
            MyTreeNode treenode = ( MyTreeNode )node; // MyTreeNode=DefaultMutableTreeNode
            /* colonne 1 = colonne des cases à cocher */
            if (column == 1) {
                /* On affecte la valeur de "value" à la variable checked du noeud */
                treenode.setChecked((boolean)value);
     
                int row = maFrame.getTreeTable().getSelectedRow();
                if(treenode.isChecked()){
                    maFrame.getTreeTable().setSelectionBackground(row%2==0?
                            new Color(243,151,151):
                            new Color(247,234,111));
                }
                else{
                    maFrame.getTreeTable().setSelectionBackground(row%2==0?
                            new Color(250,200,191):
                            new Color(250,250,191));                            
                }
     
              /* Autres traitements....................*/
    }

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

Discussions similaires

  1. Highlightable Control - affichage sur une ligne
    Par stess29 dans le forum Visual Studio
    Réponses: 0
    Dernier message: 17/06/2011, 08h29
  2. [JTable] Highlight d'une ligne
    Par JAVA man dans le forum Composants
    Réponses: 8
    Dernier message: 18/08/2004, 17h06
  3. Réponses: 9
    Dernier message: 12/08/2002, 07h38
  4. [TP]lire une ligne de l'ecran et la stocker dans une chaine
    Par Bleuarff dans le forum Turbo Pascal
    Réponses: 26
    Dernier message: 02/07/2002, 10h08
  5. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 15h23

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