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 :

Jtable et Renderer


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Informaticien
    Inscrit en
    Juin 2004
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Informaticien
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2004
    Messages : 184
    Par défaut Jtable et Renderer
    Bonjour,

    Malgré tout les articles sur le sujet je me heurte a la mise en place de renderer sur un jtable.

    En premier j'applique sur le jtable l'affichage de lignes avec des couleurs alternées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DefaultTableCellRenderer renderer0=new JTableRenderer2couleurs();
    jTableTest.setDefaultRenderer(Object.class,renderer0);
    Tout est ok sauf, lorsque j'essaye d'ajouter un setToolTipText sur une colonne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DefaultTableCellRenderer renderer =new DefaultTableCellRenderer();
    renderer.setToolTipText("test !!");
    jTableTest.getColumnModel().getColumn(2).setCellRenderer(renderer);
    la colonne perd alors l'affichage en couleur alternée.

    je n'arrive pas à concilier les deux.

    Ci dessous le code du Renderer2Couleurs

    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
     
     
    import java.awt.Color;
    import java.awt.Component;
     
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableCellRenderer;
     
     
    public class JTableRenderer2couleurs extends DefaultTableCellRenderer {
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
     
    	public JTableRenderer2couleurs () {
    		super();
    	}
     
    	public Component getTableCellRendererComponent(JTable table, Object value, boolean 
     
    isSelected,boolean hasFocus, int row, int column) {
    		Component comp = super.getTableCellRendererComponent(table, value, 
     
    isSelected, hasFocus, row, column);
    		if ((row & 1) == 0) 
    		{ // Ligne paire
    			comp.setBackground(Color.CYAN);
    		} 
    		else 
    		{ // Ligne impaire
    			comp.setBackground(Color.WHITE);
    		}
    		return comp;
    	}
    }

    Merci pour votre aide.

  2. #2
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Salut,

    Citation Envoyé par rupteur Voir le message
    la colonne perd alors l'affichage en couleur alternée.
    Ben, normal...
    Puisque tu lui passe un autre renderer pour cette colonne qui n'est pas le renderer qui te colorie une ligne sure deux ! Forcement ce renderer ne peut faire quelque chose pour lequel il n'est pas fait.

    je ne sais pas bien ce que fait la méthode setToolTip du renderer, mais il me semble que tu devrais plutot mettre tes toolTip sur les composants affichés par le renderer (ceux renvoyés par la méthode getTableCellRendererComponent).

  3. #3
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par visiwi Voir le message
    Puisque tu lui passe un autre renderer pour cette colonne qui n'est pas le renderer qui te colorie une ligne sure deux ! Forcement ce renderer ne peut faire quelque chose pour lequel il n'est pas fait.
    +1

    Au passage lorsque tu hérites ou que tu utilises le renderer par défaut, tu peux utiliser l'UIManager pour colorier les lignes alternatives, en définnissant une fois pour toute la couleur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UIManager.put("Table.alternateRowColor", Color.decode("#E1E4F2"));
    Citation Envoyé par visiwi Voir le message
    je ne sais pas bien ce que fait la méthode setToolTip du renderer, mais il me semble que tu devrais plutot mettre tes toolTip sur les composants affichés par le renderer (ceux renvoyés par la méthode getTableCellRendererComponent).
    getTableCellRendererComponent() se retourne lui même... Donc cela devrait fonctionner.

    a++

  4. #4
    Membre Expert
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Par défaut
    Il me semble que les composants retournés par le renderer ne sont pas directement accessibles dans la JTable, au lieu de cela ils sont englobés dans cette dernière, comme si une couche transparente les protégeait. J'avais essayé de placer un mouseListener sans succès. Me trompe-je ? Dans ce cas, un tooltip sur le composant renvoyé par le renderer ne serait d'aucun effet.

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par muad'dib Voir le message
    Il me semble que les composants retournés par le renderer ne sont pas directement accessibles dans la JTable, au lieu de cela ils sont englobés dans cette dernière, comme si une couche transparente les protégeait. J'avais essayé de placer un mouseListener sans succès. Me trompe-je ?
    C'est tout à fait ca !
    En fait le renderer se modifie et se renvoi lui même, et la JTable l'affiche sans vraiment l'ajouter. Ainsi si tu as un tableau de 50000 éléments, tu n'auras qu'un seul et unique composant qui sera modifié/dessiné lorsqu'il y en a besoin.
    C'est nettement moins couteux de de gérer 50000 composants

    Et comme le composant n'est pas vraiment réellement ajouté, on ne peut pas utiliser ses listeners (mais il y a un moyen détourné - voir plus loin)

    Citation Envoyé par muad'dib Voir le message
    Dans ce cas, un tooltip sur le composant renvoyé par le renderer ne serait d'aucun effet.
    Sauf qu'en fait ce cas particulier est géré par la JTable, qui redemande alors le renderer de la cellule et renvoie la valeur de son texte.



    Pour les listeners, il faut distinguer deux cas :
    • Les MouseListeners ne peuvent pas être appliqué à la cellule, mais peuvent parfaitement être appliqué sur la JTable. Il suffit alors de récupérer la cellule correspondante avec rowAtPoint()/columnAtPoint() :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      		table.addMouseMotionListener(new MouseAdapter() {
      			@Override
      			public void mouseMoved(MouseEvent e) {
      				Point point = e.getPoint();
      				int row = table.rowAtPoint(point);
      				int col = table.columnAtPoint(point);
       
      				// ...
      				System.out.printf("cellule (%d,%d)%n", row, col);
      			}
      		});
    • Quand aux autres listeners spécifiques (comme les actionListener sur un bouton), ils s'appliquent généralement sur le composant "Editor" qui est réellement ajouté à la JTable lors de l'édition d'une cellule...


    a++

  6. #6
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Mais si... voici un exemple sur des objets Color

    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
    import java.awt.Color;
    import java.awt.Component;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.table.TableCellRenderer;
     
    public class Test {
     
    	public static void main(String[] args) {
    		new Test();
    	}
     
    	Object[][] donnees = {
    			{ "Swing", "Astral", "standard", Color.red, Boolean.TRUE },
    			{ "Swing", "Mistral", "standard", Color.yellow, Boolean.FALSE },
    			{ "Gin", "Oasis", "standard", Color.blue, Boolean.FALSE },
    			{ "Gin", "boomerang", "compétition", Color.green, Boolean.TRUE },
    			{ "Advance", "Omega", "performance", Color.cyan, Boolean.TRUE }, };
    	String[] titreColonnes = { "marque", "modèle", "homologation", "couleur",
    			"check" };
     
    	public Test() {
    		MonModele model = new MonModele(donnees, titreColonnes);
    		JTable jTable1 = new JTable(model);
     
    		jTable1.setDefaultRenderer(Color.class, new ColorCRenderer());
     
    		JPanel panel = new JPanel();
    		panel.add(new JScrollPane(jTable1));
     
    		JFrame frame = new JFrame();
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.setContentPane(panel);
    		frame.pack();
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
    	}
     
    }
     
    class MonModele extends AbstractTableModel {
    	Object donnees[][];
    	String titres[];
     
    	public MonModele(Object donnees[][], String titres[]) {
    		this.donnees = donnees;
    		this.titres = titres;
    	}
     
    	public int getColumnCount() {
    		return donnees[0].length;
    	}
     
    	public Object getValueAt(int parm1, int parm2) {
    		return donnees[parm1][parm2];
    	}
     
    	public int getRowCount() {
    		return donnees.length;
    	}
     
    	public String getColumnName(int col) {
    		return titres[col];
    	}
     
    	public Class getColumnClass(int c) {
    		return getValueAt(0, c).getClass();
    	}
    }
     
    class ColorCRenderer extends JLabel implements TableCellRenderer {
     
    	public ColorCRenderer() {
    		this.setOpaque(true);
    	}
     
    	public Component getTableCellRendererComponent(JTable table, Object value,
    			boolean isSelected, boolean hasFocus, int row, int col) {
    		Color color = (Color) value;
    		setBackground(color);
    		int r = color.getRed();
    		int g = color.getGreen();
    		int b = color.getBlue();
    		setToolTipText("<html>Rouge : <b>" + r + "</b><br>Vert : <b>" + g + "</b><br>Bleu : <b>" + b + "</b></html>");
    		return this;
    	}
     
    }

  7. #7
    Membre très actif
    Homme Profil pro
    Informaticien
    Inscrit en
    Juin 2004
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Informaticien
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2004
    Messages : 184
    Par défaut
    Effectivement le fait d'ajouter un setToolTipText dans le renderer des couleurs alternées fonctionne.

    le problème étant que j'ai besoin d'un setToolTipText différent pour chaque colonne de ma jTable.

    je peux évidemment tester et affecter suivant la colonne dans la classe gérant le renderer, mais cela ne va t-il pas consommer trop de ressources ?

    Merci déjà, pour ces éclaircissements.

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

Discussions similaires

  1. [JTable][JComboBox] renderer et editor
    Par daedric dans le forum Composants
    Réponses: 1
    Dernier message: 25/05/2006, 18h29
  2. [JTABLE][MODEL][RENDERER]Communication
    Par cameleon2002 dans le forum Composants
    Réponses: 1
    Dernier message: 31/12/2005, 14h36
  3. [Jtable] DefaultTableModel renderer des boolean
    Par lilou77 dans le forum Composants
    Réponses: 2
    Dernier message: 20/12/2005, 15h32
  4. [JTable] cell renderer
    Par biozaxx dans le forum Composants
    Réponses: 2
    Dernier message: 21/04/2005, 10h04
  5. [Swing]Case a cocher JTable, et Renderer
    Par bibx dans le forum Composants
    Réponses: 16
    Dernier message: 29/12/2004, 14h49

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