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 :

Couleur de fond des lignes sélectionnées d'une JTable


Sujet :

Composants Java

  1. #1
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Points : 20
    Points
    20
    Par défaut Couleur de fond des lignes sélectionnées d'une JTable
    Bonjour;

    Mon problème est simple je souhaite que lorsque je clique sur un bouton (appartenant à un JPanel) les lignes sélectionnées de ma JTable changent de couleur de background.

    (Je précise que si je reclique sur le bouton, la sélection des lignes précédentes garde son fond coloré)

    Pour cela j'ai défini un renderer qui étend DefaultTableCellRenderer mais impossible de définir la bonne condition à l'intérieur. (il ne me semble pas avoir vu la réponse sur ce forum)
    J'ai essayé avec un booleen qui prend true lorsque je clique sur le bouton puis avec l'instruction (if ((row==getSelectedRow()) mais je n'obtiens pas ce que je veux.

    Merci de votre aide !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public class ColorRenderer extends DefaultTableCellRenderer {
     
      public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)  {
     
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
     
        if() {
          c.setBackground(Color.BLUE);
     
        }
      }
    }

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    C'est déjà géré automatiquement ça, sur un JTable. Si tu veux changer la couleur (à éviter normalement, car on devrait respecter le thème choisi par l'utilisateur), tu peux le faire par la méthode setSelectionBackground() de JTable.

    C'est différent si tu veux avoir des couleurs différentes pour chaque ligne, ou éventuellement utiliser un rendu plus élaboré qu'une couleur uniforme (genre un dégradé par exemple), on peut effectivement passer par un renderer : dans ce cas, on sait qu'une ligne est sélectionnée par le paramètre isSelected de la méthode getTableCellRendererComponent().

    Attention, toutefois, en réalisant ça en étendant le DefaultTableCellRenderer : utiliser setBackground, pour affecter la couleur de fond, va modifier la couleur de fond normale (celle utilisée pour les lignes non sélectionnées)...
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    J'utilise le setSelectionBackground() lors du clic sur le bouton. Les cellules apparaissent bien colorées. Mais si je clique sur une autre cellule de la JTable (avant même d'avoir cliqué sur le bouton) la cellule est aussi colorée.

    En utilisant le renderer et la condition if(isSelected) la cellule est colorée avant même d'avoir cliqué sur le bouton...

    Je ne souhaite rien de très élaboré, (fond uniforme) seulement que l'on puisse "identifier" les cellules de la JTable pour lesquelles on a cliqué sur le bouton.

    Le problème avec le renderer est que la couleur de fond normale est modifiée comme vous dites, et que la cellule colorée ne parait plus selectionnable...

    Avez vous des solutions ?

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Il fait quoi ce bouton ? Il fait double emploi avec la sélection standard d'une JTable (quand on clique sur une ligne), où il marque la ligne sélectionnée comme faisant partie d'une liste (une "autre sélection" qui n'a rien à voir avec la sélection standard ? Dans ce dernier cas, il faut se poser la question "pourquoi ?". Pourquoi aurais-ton besoin d'ajouter une sélection en plus de la sélection existante. Ergonomiquement, il y a 2 solutions : une standard (avoir une case à cocher dans chaque ligne), et une classique (avoir 2 tables, avec des boutons pour faire passer les éléments de l'une à l'autre).

    Dans le premier cas, il n'y a aucune raison d’appeler setSelectionBackground() dans le bouton. Cette méthode modifie un attribut de "style" : on l'appelle avant d'afficher, ou quand on veut changer de style.

    Dans le second cas, si tu as vraiment besoin de faire une "sélection personnalisée" en plus de la sélection standard, il faut que le renderer ait accès à ta "sélection personnalisée", et que la couleur soit gérée à part (pas avec les méthodes standard de JTable), en appelant setBackground() avant l'appel de getTableCellRendererComponent() dans la classe qui étend DefaultTableCellRender, si tel est le cas pour le TableCelleRenderer (sinon il faut tout gérer soi-même, par simple affectation, comme pour n'importe quel composant).

    Si tu as un bouton pour "sélectionner" (je parle bien de "ta" sélection, et pas de la sélection standard) une ligne, forcément, s'il faut pouvoir "désélectionner" une ligne, il faut une action pour (le même bouton, un autre, etc...).

    Pour la sélection de cellule, pour le second cas, c'est la même chose, sauf que ergonomiquement, on a pas les mêmes possibilités : reste à appliquer la seconde solution (au lieu d'une liste de lignes, avoir une liste de cellules "sélectionnées").
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    ce Jbutton (unique pour toute la JTable) permet d'identifier les lignes sélectionnées de manière standard.

    Le procédé est le suivant: je sélectionne des lignes de la JTable -> elles apparaissent avec une couleur standard (plus foncée que les lignes non sélectionnées) -> je clique sur le JButton -> elles apparaissent de la couleur désirée (mais les cellules sont tout de même sélectionnables)

    En d'autres termes, au niveau de la JTable ce bouton me servirait juste à changer la couleur par défaut des lignes sélectionnées.

    J'avoue que je suis un peu perdu avec les solutions proposées et je ne sais pas si je suis très clair.

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Il s'agit de sélection de lignes ou de cellules (ou de colonnes), parce que ce n'est pas exactement pareil.

    Donc, en gros, tu veux ajouter un niveau de sélection dans ta JTable : une ligne (ou une cellulle) peut être :
    • pas sélectionnée : standard
    • sélectionnée : standard
    • plus sélectionnée que sélectionnée : pas standard : donc il faut stocker cet état d'une manière ou d'une autre, et faire que le renderer tienne compte de cet état pour sélectionner la couleur voulue


    C'est pas super simple non plus ce que tu veux faire : c'est surtout que comme ce n'est pas standard, il faut tout faire soi-même.


    Voici un exemple pour une sélection de cellules (et j'ai simplifié en autorisant que la sélection d'une seule cellule à la fois) :

    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    public class DemoTableCellSelectionPlus {
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		Set<Cell> persoselection = new HashSet<>(); // un set qui représente la sélection "plus", qui stocke donc les cellulles sélectionnées
     
    		JTable table = createTable();
    		JButton buttonSelection = new JButton("Sélectionner");
    		buttonSelection.setEnabled(false);
    		JButton buttonDeselection = new JButton("Désélectionner");
    		buttonDeselection.setEnabled(false);
     
    		table.getSelectionModel().addListSelectionListener(e-> {
     
    				if ( table.getSelectedColumn()!=-1 && table.getSelectedRow()!=-1 ) {
    					Cell cell = new Cell(table.getSelectedColumn(), table.getSelectedRow());
    					enableButtons(buttonSelection, buttonDeselection, table, persoselection, cell);
    				}
    				else {
    					buttonSelection.setEnabled(false);
    					buttonDeselection.setEnabled(false);
    				}
     
    		});
    		table.getColumnModel().addColumnModelListener(new TableColumnModelListener() {
     
    			@Override
    			public void columnSelectionChanged(ListSelectionEvent e) {  
    					if ( table.getSelectedColumn()!=-1 && table.getSelectedRow()!=-1 ) {
    						Cell cell = new Cell(table.getSelectedColumn(), table.getSelectedRow());
     
    						enableButtons(buttonSelection, buttonDeselection, table, persoselection, cell);
    					}
    					else {
    						buttonSelection.setEnabled(false);
    						buttonDeselection.setEnabled(false);
    					} 
    			}
     
    			@Override
    			public void columnRemoved(TableColumnModelEvent e) { 
    				// si on peut supprimer et ajouter des colonnes, il faudra gérer l'enablement des boutons;
    			}
     
    			@Override
    			public void columnMoved(TableColumnModelEvent e) { 
    			}
     
    			@Override
    			public void columnMarginChanged(ChangeEvent e) { 
    			}
     
    			@Override
    			public void columnAdded(TableColumnModelEvent e) { 
    				// si on peut supprimer et ajouter des colonnes, il faudra gérer l'enablement des boutons;
    			}
    		});
     
    		table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
     
    			@Override
    			public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
    					boolean hasFocus, int row, int column) {
     
    				if ( persoselection.contains(new Cell(column,row)) ) { // signifie que la cellule est sélectionnée
    					if ( isSelected || hasFocus ) {
    						isSelected = false;
    						hasFocus = false;
    						setBackground(Color.RED.darker());
    					}
    					else {
    						setBackground(Color.RED);
    					}
    				}
    				else {
    					setBackground(null);
    				}
     
    				return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    			}
     
    		});
     
    		buttonSelection.addActionListener(e-> {
     
    			if ( table.getSelectedColumn()!=-1 && table.getSelectedRow()!=-1 ) {
    				Cell cell = new Cell(table.getSelectedColumn(), table.getSelectedRow());
    				if ( persoselection.add(cell) ) {
    					enableButtons(buttonSelection, buttonDeselection, table, persoselection, cell);
    					table.repaint();
    				}
    			}
     
    		});
    		buttonDeselection.addActionListener(e-> {
     
    			Cell cell = new Cell(table.getSelectedColumn(), table.getSelectedRow());
    			if ( persoselection.remove(cell) ) {
    				enableButtons(buttonSelection, buttonDeselection, table, persoselection, cell);
    				table.repaint();
    			}
     
    		});
     
    		JPanel buttonPanel = new JPanel();
    		buttonPanel.add(buttonSelection);
    		buttonPanel.add(buttonDeselection);
     
    		frame.getContentPane().add(table);
     
    		frame.getContentPane().add(buttonPanel, BorderLayout.SOUTH);
     
    		frame.pack();
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    	private static void enableButtons(JButton buttonSelection, JButton buttonDeselection, JTable table,
    			Set<Cell> persoselection, Cell cell) {
    		final boolean selected = persoselection.contains(cell);
    		buttonSelection.setEnabled(!selected);
    		buttonDeselection.setEnabled(selected);
    	}
     
    	private static JTable createTable() {
    		JTable table = new JTable(new Object[][]{
    			{"Data 1","Data 2","Date 3"},
    			{"Data 1","Data 2","Date 3"},
    			{"Data 1","Data 2","Date 3"}
    		}, new String[]{"Col 1","Col 2", "Col 3"});
     
    		table.setRowSelectionAllowed(false);
    		table.setColumnSelectionAllowed(false);
    		table.setCellSelectionEnabled(true);
    		table.setSelectionMode( ListSelectionModel.SINGLE_SELECTION);
     
    		return table;
    	}
     
    	public final static class Cell {
     
    		private final int x;
    		private final int y;
     
    		public Cell(int x, int y) {
    			this.x=x;
    			this.y=y;
    		}
     
    		public int getX() {
    			return x;
    		}
     
    		public int getY() {
    			return y;
    		}
     
    		@Override
    		public int hashCode() {
    			return Objects.hash(x, y);
    		}
     
    		@Override
    		public boolean equals(Object obj) {
    			if ( obj!=null && Cell.class.equals(obj.getClass()) ) {
    				Cell cell = (Cell)obj;
    				return cell.x==x && cell.y==y;
    			}
    			return false;
    		}
     
     
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    il s'agit de sélection d'une (ou plusieurs) lignes. je n'ai qu'une colonne.

    Je vais regarder cela, mais je pensais que cela serait plus simple !

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/09/2011, 13h51
  2. Réponses: 10
    Dernier message: 06/05/2010, 20h51
  3. Réponses: 2
    Dernier message: 29/03/2007, 10h18
  4. Réponses: 3
    Dernier message: 08/06/2006, 11h53
  5. [VBA-E]récupérer le nom des lignes sélectionnées d'une listbox
    Par Ania dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 06/06/2006, 11h28

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