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 :

Renderer sur une JTable


Sujet :

Composants Java

  1. #1
    Membre averti
    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
    Par défaut Renderer sur une JTable
    Bonjour,

    J'ai une question concernant les Jtable.
    j'ai une JTable composée de trois colonnes.
    La première ne contient rien (je souhaite seulement changer sa couleur de fond selon les actions utilisateur).
    La deuxième correspond à des String
    La dernière à des JButton.

    Je définis du coup un renderer pour l'affichage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     public class TableRenderer extends DefaultTableCellRenderer {
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        	Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, hasFocus, column);
        	if (column == 0) {
        		cell.setBackground(Color.BLACK);
        		return cell;
          }
          if (column == 2) return (JButton) value;
          else return this;
        }
      }

    Voici le modèle de la JTable :

    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
     
     
     class MyModel extends AbstractTableModel {
     
      private final List<String> names= new ArrayList<String>();
     
    @Override
        public Object getValueAt(int row, int column) {
          if (columnIndex == 0) return "";
          else if (columnIndex == 2) return new JButton("name");
          else return names.get(row);
        }
     
        @Override
        public int getRowCount() {
          return names.size());
        }
     
        @Override
        public int getColumnCount() {
          return columnName.length;
        }
     
        @Override
        public String getColumnName(int column) {
          return columnName[column];
        }
     
        @Override
        public Class<?> getColumnClass(int column) {
          else if (column == 2) return JButton.class;
          else return String.class;
        }
     
        @Override
        public boolean isCellEditable(int row, int column) {
          return false;
        }
    }
    Ensuite j'applique le renderer avec l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setDefaultRenderer(Object.class, new TableRenderer());
    La couleur de fond est appliquée même sur la deuxième colonne. Je ne vois pas où il y a l'erreur...

    Merci d'avance de votre aide

  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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Salut,

    Déjà, tu affectes un unique renderer pour l'ensemble des types, et en plus, il s'agit d'une seule et unique instance. Comme tu changes sa couleur : peu importe le test sur column, elle est changée en noir, point. Le renderer est utilisé tel quel pour générer l'affichage.

    Il ne faut pas procéder de cette manière :

    • Affecte une instance de renderer par colonne (et non par type) ;
    • Une instance différente pour chaque colonne, même si c'est la même classe, mais tant qu'à faire, comme l'affichage est complètement différente, autant utiliser 2 classes différentes, adaptées à chaque affichage
    • inutile ensuite de changer la couleur à chaque rendu : l'affecter une fois pour toute est suffisante. Et plus besoin de tester column : le renderer est sur la colonne 0 de toute manière.
    • Par compte, si tu as plusieurs actions, ce serait mieux de mettre dans la colonne une valeur qui représente l'action et qui donne la couleur


    Exemple :
    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
    public class JTableRendererDemo {
     
    	public enum Action {
    		CREATE(Color.WHITE, Color.BLUE),
    		DELETE(Color.WHITE, Color.RED),
    		UPDATE(Color.BLACK, Color.ORANGE);
     
    		private final Color fg;
    		private final Color bg;
    		private Action(Color fg,Color bg) {
    			this.fg=fg;
    			this.bg=bg;
    		}
    		public Color getForeground() {
    			return fg;
    		}
     
    		public Color getBackground() {
    			return bg;
    		}
    	}
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		frame.getContentPane().add(createTable());
     
    		frame.setSize(600, 400);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
     
    	}
     
    	private static Component createTable() {
    		final Object[][] data = new Object[][]{
    			{ Action.DELETE, "toto", "" },
    			{ Action.UPDATE, "", "" },
    			{ Action.CREATE, "tutu", "" }
    		};
    		final JTable table = new JTable(data, new String[]{"Action","Name",""}); 
     
    		table.getColumnModel().getColumn(0).setCellRenderer(new DefaultTableCellRenderer() {
    			@Override
    			public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
    					boolean hasFocus, int row, int column) {
    				if( value instanceof Action) {
    					setForeground(((Action)value).getForeground());
    					setBackground(((Action)value).getBackground());
    				}
    				else {
    					setForeground(table.getForeground());
    					setBackground(table.getBackground());
    				}
    				return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    			}
    		});
    		table.getColumnModel().getColumn(1).setCellRenderer(new DefaultTableCellRenderer() {
    			@Override
    			public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
    					boolean hasFocus, int row, int column) {
    				Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    				if ( value instanceof String && ((String)value).isEmpty() ) {
    					setValue("Vide");
    					setFont(getFont().deriveFont(Font.ITALIC));
    				}
    				return component;
    			}
    		});
     
    		final JPanel panel = new JPanel(new BorderLayout());
    		final JScrollPane scrollpane = new JScrollPane(table);
    		/*final JViewport columnView = new JViewport();
    		columnView.setView(table.getTableHeader());
    		scrollpane.setColumnHeader(columnView);*/
    		panel.add(scrollpane);
    		return scrollpane;
    	}
     
    }
    Tu remarqueras, qu'on peut avoir à modifier le rendu avant ou après le "super"...

    Par contre, pour les boutons, ce n'est pas du tout comme ça qu'il faut faire. Enfin, pour le renderer, c'est une solution, mais déjà, surtout ne pas créer une nouvelle instance dans getValueAt() (à chaque fois que ça va être appelé on va créé une nouvelle instance). Eviter même de mettre le bouton dans les données (l'action oui, un actionlistener, ou une valeur qui permet de retrouver l'action (une enum)). Ensuite, il faudra aussi utiliser un TableCellEditor. Il y a des exemples dans ce tutoriel.
    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 averti
    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
    Par défaut
    Salut,
    Merci pour cette réponse !

    Cela a résolu mes problèmes

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

Discussions similaires

  1. Appliquer un renderer sur une cellule d'une JTable
    Par Simo-03 dans le forum Composants
    Réponses: 1
    Dernier message: 15/05/2014, 06h18
  2. MouseListener sur une JTable
    Par ythim dans le forum Composants
    Réponses: 3
    Dernier message: 21/04/2006, 14h40
  3. Recupérer un évènement sur une JTable
    Par pkdev dans le forum Composants
    Réponses: 2
    Dernier message: 06/12/2005, 11h19
  4. [jTable] Gérer clik droit sur une jTable vide
    Par serwol dans le forum Composants
    Réponses: 4
    Dernier message: 01/12/2005, 10h06
  5. Non réception d'un evènement sur une JTable
    Par Kant dans le forum Composants
    Réponses: 4
    Dernier message: 28/05/2004, 10h38

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