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 :

Comment changer de couleur avec un TableCellRenderer


Sujet :

Composants Java

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 213
    Points : 96
    Points
    96
    Par défaut Comment changer de couleur avec un TableCellRenderer
    Salut à tous,

    J'ai un problème d'affichage lors de l'appel de ma méthodes TableCellRenderer personnalisé.
    Ni la police ni la couleur ne change avec cette façon.
    Utilisation de la méthodes CustomTableCellRenderer :
    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
     
    public void addLog(String message, infoMessage info)
    {
    	JTable log = IhmConverter.getInstance().getTblLog();
    	DefaultTableModel model = (DefaultTableModel) log.getModel();
    	TableCellRenderer renderer = new CustomTableCellRenderer();
    	SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    	Date toDay = new Date();
     
    	if (info.equals(infoMessage.info))
    	{
    		String val = dateFormat.format(toDay) +" - INFO : "+ message;
    		model.addRow(new Object[]{val});
    	((CustomTableCellRenderer)renderer).setColorsAndFont(Color.white, Color.black, Final.getFont());
    		renderer.getTableCellRendererComponent(log, new Object[]{val}, true, true, 1, 1);
    	}
    	else if (info.equals(infoMessage.warning))
    	{ ... }
    La méthode CustomTableCellRenderer :
    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
     
    package IHM;
     
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Font;
     
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableCellRenderer;
     
    import EVENT.Final;
     
    public class CustomTableCellRenderer extends DefaultTableCellRenderer
    {
    	private static final long serialVersionUID = 1L;
    	private Color bg = Color.white;
    	private Color fg = Color.black;
    	private Font font = Final.getFont();
    	public Component getTableCellRendererComponent(JTable table, Object value,
    			boolean isSelected, boolean hasFocus, int row, int column)
    	{
    		Component cell = super.getTableCellRendererComponent(table, value,
    				isSelected, hasFocus, row, column);
     
    		cell.setBackground(bg);
    		cell.setForeground(fg);
    		cell.setFont(font);
     
    		return cell;
    	}
    	public void setColorsAndFont(Color bg, Color fg, Font f)
    	{
    		this.bg = bg;
    		this.fg = fg;			
    		this.font = f;
    	}
    }
    Merci d'avance pour vos aides

  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,

    La ligne renderer.getTableCellRendererComponent(log, new Object[]{val}, true, true, 1, 1); dans addLog ne sert à rien. Mais un petit repaint() de la JTable serait nécessaire, vu que rien ne lui permet de savoir qu'on change quelque chose à l'affichage lorsqu'on fait [(CustomTableCellRenderer)renderer).setColorsAndFont(Color.white, Color.black, Final.getFont());][/c].
    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 régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 213
    Points : 96
    Points
    96
    Par défaut
    Autant pour moi, j'ai oublié une ligne important après la condition à te donner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    log.setDefaultRenderer(String.class, renderer);
    C'est là que je l'utilise.

  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
    Cette ligne n'a rien de pertinent : c'est l'affectation du renderer par défaut pour la classe String. Ceci doit être fait une fois au moment de la création de la JTable, et n'a rien à voir avec les datas.

    Normalement, un renderer devrait se gérer de lui-même : avoir le moyen en fonction des données de sélectionner la bonne couleur. Tout le reste du processus (mise à jour du modèle, rafraîchissement de la JTable) déclenchera automatiquement l'affichage voulu en fonction des données.

    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
    public class JTableCellRendererExemple {
     
    	public static void main(String[] args) {
    		JFrame frame = new JFrame("Exemple");
     
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		JPanel panel = new JPanel(new BorderLayout());
     
    		String[] columns = {"id", "valeur"};
    		Object[][] rowData = {
    				{ "machin", 100 },
    				{ "truc", 0 },
    				{ "bidule", -100 },
    		};
     
    		JTable table = new JTable(new DefaultTableModel( rowData, columns ));
    		table.getColumnModel().getColumn(1).setCellRenderer(new ExempleCellRenderer());
     
    		panel.add(table.getTableHeader(),BorderLayout.NORTH);
    		panel.add(new JScrollPane(table));
     
    		frame.add(panel);
     
    		JPanel buttonPanel = new JPanel();
    		addButton(buttonPanel, table, -100);
    		addButton(buttonPanel, table, 0);
    		addButton(buttonPanel, table, 100);
    		frame.add(buttonPanel, BorderLayout.SOUTH);
     
    		frame.setSize(600, 300);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
    	}
     
    	private static void addButton(JPanel buttonPanel, JTable table, int value) {
    		JButton button = new JButton("add "+value);
    		button.addActionListener(e-> add(table, value));
    		buttonPanel.add(button);
    	}
     
    	private static void add(JTable table, int value) {
    		DefaultTableModel model = (DefaultTableModel) table.getModel();
    		model.addRow(new Object[]{"Added", value});
    	}
     
    	public static class ExempleCellRenderer extends DefaultTableCellRenderer {
     
    		@Override
    		protected void setValue(Object value) {
    			super.setValue(value);
    			if ( value instanceof Integer ) {
    				Integer intValue = (Integer) value;
    				if (intValue<0 ) {
    					setForeground(Color.RED);
    				}
    				else if ( intValue==0 ) {
    					setForeground(Color.BLACK);
    				}
    				else if ( intValue>0 ) {
    					setForeground(Color.BLUE);
    				}
    			}
    		} 
     
    	}
     
    }
    Tu remarqueras que j'affecte qu'une fois le renderer. Ensuite, je ne fais qu'ajouter des lignes à mon modèle, et elles s'affichent dans la couleur que je veux (les négatives en rouge, les positives en bleu, sinon en noir).
    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 régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 213
    Points : 96
    Points
    96
    Par défaut
    Juste pour tester le résultat comment je peux modifier ça en java 6 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    button.addActionListener(e -> add(table, value));
    Merci

  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
    Ce n'est pas très compliqué de remplacer une lambda par le code explicite correspondant, surtout avec un EDI (par la completion on obtient l'interface attendue, et le code se créé, il suffit de copier ce qu'il y après le -> dans la méthode, ajouter un return si nécessaire, et veiller à ce que le nom des paramètres soient celui utilisé dans la lambda (ils sont dans le même ordre).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    button.addActionListener(new ActionListener() {
     
       public void actionPerformed(ActionEvent e) {
              add(table, value))
       }
     
    } );
    En rendant final table et value.
    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 régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 213
    Points : 96
    Points
    96
    Par défaut
    Ça marche :
    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
     
    package IHM;
     
    import java.awt.Color;
     
    import javax.swing.table.DefaultTableCellRenderer;
     
    public class CustomTableCellRenderer extends DefaultTableCellRenderer
    {
    	private static final long serialVersionUID = 1L;
     
    	@Override
    	protected void setValue(Object value) {
    		super.setValue(value);
    		String val = (String)value; 
    		if (val.contains("INFO")) {
    			setForeground(Color.black);
    		} else if (val.contains("WARNING")) {
    			setForeground(Color.blue);
    		} else if (val.contains("ERROR")) {
    			setForeground(Color.red);
    		}
    	}
    }
    Merci

Discussions similaires

  1. [XL-2007] Comment changer les couleurs d'un graph avec une macro?
    Par abfabulous dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/02/2013, 12h43
  2. Réponses: 5
    Dernier message: 17/05/2007, 14h28
  3. Comment changer les couleurs des lignes avec displaytag
    Par rlnd23 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 09/10/2006, 13h52
  4. Réponses: 2
    Dernier message: 01/12/2004, 22h48

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