Accueil > Forum > > > > Colorer des cellules d'un JTable Amaguiz
Colorer des cellules d'un JTable Amaguiz
lundi 1 juin 2009 à 14:50:20 |
Colorer des cellules d'un JTable Amaguiz

crjohnson
|
Salut les frères, Je bûche sur ce prob' depuis ce matin et je parviens toujours pas à atteindre mon but. J'aimerais colorer le fond des cellules sélectionnées dans la JTable en fonction de la couleur choisie dans une JComboBox. L'utilisateur devra sélectionner les cellules qu'il veut colorer et ensuite faire son choix dans la combobox à côté et une fois le choix fait les cellules sélectionnées prennent le fond de la couleur sélectionnée. Le problème c'est que la coloration se fait bizarrement. Par exemple, quand je sélectionne la 1ère ligne, ça se passe normalement et si je sélectionne la dernière, toute la table prend la couleur. On dirait que les couleurs veulent pas laisser de cases avec coloration noire d'origine entre elles. Vous comprendrez mieux en testant ce code. Je vous lache la partie pertinente du code et je vous serai reconnaissant de me filer un coup de main : CLASSE "Fenetre" :import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.GridLayout;
import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellRenderer;
class Fenetre extends JFrame { String[] titres = { "Composer" , "un" , "numéro" }; Object[][] entrees = { { "1" , "2" , "3" }, { "4" , "5" , "6" }, { "7" , "8" , "9" }, { " " , "0" , " " }, }; DefaultTableModel modele = new DefaultTableModel(entrees, titres); JTable table; JPanel panneau_east = new JPanel(); JLabel label_couleurs = new JLabel("Colorier en :"); JComboBox combobox_couleurs = new JComboBox(); public Fenetre() { setTitle("*** T¤$T ***"); setSize(400, 200); setResizable(false); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); table = new JTable(modele) { public Component prepareRenderer(TableCellRenderer renderer, int ligne, int colonne) { Component component = super.prepareRenderer(renderer, ligne, colonne); // Je parie que c'est dans les conditions ci-dessous qu'il manque du matos. if(combobox_couleurs.getSelectedItem() == "Rouge") { if(ligne == table.getSelectedRow()) { component.setBackground(Color.RED); } } if(combobox_couleurs.getSelectedItem() == "Vert") { if(ligne == table.getSelectedRow()) { component.setBackground(Color.GREEN); } } if(combobox_couleurs.getSelectedItem() == "Bleu") { if(ligne == table.getSelectedRow()) { component.setBackground(Color.BLUE); } } table.setBackground(Color.BLACK); table.setForeground(Color.WHITE); return component; } }; combobox_couleurs.addItem("... Rien"); combobox_couleurs.addItem("Rouge"); combobox_couleurs.addItem("Vert"); combobox_couleurs.addItem("Bleu"); panneau_east.setLayout(new GridLayout(2, 1)); panneau_east.add(label_couleurs); panneau_east.add(combobox_couleurs); getContentPane().add(new JScrollPane(table), BorderLayout.CENTER); getContentPane().add(panneau_east, BorderLayout.EAST); } }Pour lancer la bête : CLASSE "Main" :@SuppressWarnings("unused") public class Main { public static void main(String[] args) { Fenetre fenetre = new Fenetre(); } }Merci les gens.
|
|
lundi 1 juin 2009 à 16:01:43 |
Re : Colorer des cellules d'un JTable Amaguiz

uhrand
|
Nous devons comprendre que le "rendererComponent" est un composant unique qui est utilisé pour toutes les cellules de la table. Si je peus dire, il est utilisé comme un "tampon configurable" que le système tamponne sur chaque cellule. Prenons, comme dans ton exemple, la propriété "background" du "tampon". Dans ton exemple, cette propriété est bien configurée pour trois types de cellules: rouge, vert et bleu. Puisqu'il y a qu'un seul "tampon", toutes les autres cellules auront alors la propriété "background" qui est configurée par hasard pour un des trois types! Donc, ce qu'il faut faire, c'est d'initialiser la propriété "background" par une couleur de défaut, avant de procéder aux cas spécifiques. Exemple: // Je parie que c'est dans les conditions ci-dessous qu'il manque du matos. component.setBackground(table.getBackground()); // initialiser la propriété "background" //cas spécifiques (rouge, vert, bleu): ...
|
|
lundi 1 juin 2009 à 16:22:43 |
Re : Colorer des cellules d'un JTable Amaguiz

crjohnson
|
Ah voilà c'est la fameuse "mémo" de fond de table que je cherchais, merci fréro. Mais il reste un problème : ça fonctionne pas.
Par exemple, en choisissant rouge je sélectionne la ligne 1, pas de soucis, ensuite je sélectionne la ligne 3, elle se remplit de rouge mais la ligne 1 est retournée au noir, idem en changeant de couleur.
Je crois que c'est parce que la fonction "getBackground()" de "JTable" retourne un "Color", ce qui signifie que ça donnera une seule couleur : le noir d'origine qu'on a défini : "table.setBackground(Color.BLACK);". En fait faudrait trouver une fonction qui permette de mémoriser la couleur de chaque cellule du tableau quand on l'appelle à un instant "t", mais quelle est-elle... J'ai pensé à un "ColorModel" mais je vois pas comment m'y prendre.
Encore merci.
|
|
mercredi 3 juin 2009 à 21:32:54 |
Re : Colorer des cellules d'un JTable Amaguiz

uhrand
|
Effectivement, tu as encore un autre problème: tu détermine le type de la ligne sur base de la combobox_couleurs, ce qui ne peut pas fonctionner, car la combobox_couleurs ne contient pas de référence à une ligne. Nous pouvons par exemple utiliser une Map pour stocker la couleur par ligne ou définir une classe qui représente une ligne et y stocker la couleur, ... Le stockage pour la ligne sélectionnée peut se faire déjà dans le traitement de la combobox_couleurs (p.ex. dans un ActionListener attaché à la combobox_couleurs). Puis, dans "prepareRenderer" nous exploitant la "colorMap" ou l'objet reprsésentant la ligne...
|
|
vendredi 5 juin 2009 à 23:08:40 |
Re : Colorer des cellules d'un JTable Amaguiz

crjohnson
|
Fada frère j'arrive pas à comprendre ce foutu objet JTable... et l'objet Map j'ai beau lire des articles à ce sujet je sais toujours pas m'en servir.
J'aimerais simplement que tous les fonds de toutes les cellules de la ligne sélectionnée se colorent en une couleur spécifique, quite à en définir une par défaut pour les tests. Au click sur une autre ligne, on fait la même chose mais en gardant en mémoire l'opération précédente, etc. Et au pire, sélectionner toutes les lignes à colorier, sélectionner la couleur dans la combo' et appuyer sur le champignon pour les remplir, mais ce que j'arrive pas à faire c'est MEMORISER le fond. Si je fais des trucs genre "else setBackground(Color.WHITE);" je perds la mémo' et si je le fais pas y a trop de lignes qui se remplissent alors j'suis coincé fréro. Si un gadjo qui a déjà été dans cette galère passe par là il peut lacher tout son code sérieux moi je me démerde pour retrouver les pièces de l'engin.
Merci de l'aide, on va gagner Mr. Saint-Josse...
|
|
samedi 6 juin 2009 à 04:35:32 |
Re : Colorer des cellules d'un JTable Amaguiz

uhrand
|
Réponse acceptée !
Comme je l'ai déjà expliqué plus haut, le "rendererComponent" est un composant unique qui est utilisé pour toutes les cellules de la table. C'est en quelque sorte un "tampon configurable". Puisque c'est un simple tampon, il ne sait pas mémoriser la configuration par ligne. Donc, dans la méthode "prepareRenderer" nous devons chaque fois reconfigurer le tampon. L'utilisation de l'interface "Map" est très simple pour mémoriser les couleurs des lignes. P.ex. voici le code pour créer la colorMap: Map<Integer, Color> colorMap = new HashMap<Integer, Color>(); Pour mémoriser une ligne avec couleur bleu: colorMap.put(ligne, Color.BLUE); Pour avoir la bonne couleur dans notre méthode "prepareRenderer": colorMap.get(ligne)
|
|
samedi 6 juin 2009 à 11:37:53 |
Re : Colorer des cellules d'un JTable Amaguiz

crjohnson
|
Réponse acceptée !
Comment il s'est trop simplifié le code avec ta "colorMap" cousin tu m'as fait kiffer, on part en vacances !
Alors pour tous les chers collègues qui veulent colorier une table à leur guise, voici la solution pour les lignes :
Commence par déclarer une map de couleurs dans les attributs de ta classe, on le lache "private" pour respecter l'encapsulation :
private Map<Integer, Color> colorMap = new HashMap<Integer, Color>();
Après, tu déclares ta table en redéfinissant la méthode "prepareRenderer()" de la classe "DefaultTableModel" :
table = new JTable(new DefaultTableModel(entrees, titres)) { private static final long serialVersionUID = 1L; public Component prepareRenderer(TableCellRenderer renderer, int ligne, int colonne) { Component component = super.prepareRenderer(renderer, ligne, colonne); component.setBackground(colorMap.get(ligne)); return component; } };
Ensuite, tu peux faire un listener qui va écouter les clicks sur ta table :
table.addMouseListener(new MouseListener() { public void mouseReleased(MouseEvent event) { if(combobox_couleurs.getSelectedItem() == "... Rien") { colorMap.put(table.getSelectedRow(), Color.WHITE); table.updateUI(); } if(combobox_couleurs.getSelectedItem() == "Rouge") { colorMap.put(table.getSelectedRow(), Color.RED); table.updateUI(); } } public void mouseEntered(MouseEvent event){} public void mouseExited(MouseEvent event){} public void mousePressed(MouseEvent event){} public void mouseClicked(MouseEvent event){} });
Vaut mieux implémenter la méthode "mouseReleased()" parce que "mouseClicked" y a des fois ça réagit mal, je pense c'est à cause du temps.
Voilà les gars y a tous les éléments pour faire cette fameuse, tu sais j'ai lu plein de topics où des gens demandaient la même chose que moi et y avait que des soluces compliquées qui étaient proposées et en plus elles marchaient pas. Là t'as une soluce simple t'as même pas besoin de faire une nouvelle classe c'est ça la classe.
Grand merci à "uhrand" pour ses lumières.
|
|
Cette discussion est classée dans : combobox, table, couleurs, import, component
Répondre à ce message
Sujets en rapport avec ce message
JCombobox dans un JTable : getSelectedIndex, getSelectedItem... [ par largo_winzclav ]
Bonjour et merci d'avance à tous ceux qui prendront le temps de m'aider,Dans une de mes applets, je fais apparaitre des cellules d'un JTable sous form
Combobox dans une jtABLE [ par perechev ]
salut les gens, Est-ce quelqu'un saurait si on peut faire une table avec des combobox dedans? mais je voudrais choisir les cellules et pas que ce soit
[serialisation] JTABLE pb [ par bidani ]
salut,j'arrive a serialiser une jtable mais le petit probleme suibvant apparait :(la serialisation marche si je rajoute ou supprime des lignes sans l
Changer le nom de la colonne d'un JTable [ par Ombitious_Developper ]
Salut :Voici un code pour créer un JTable avec des colonnes ayant des noms, mais ce dernier n'affiche rien :import javax.swing.*;import javax.swing.ta
combo dans Jtable [ par zarda ]
salut voila une vue generale sur le pbun JTable contenant quelque ComboBoxLe choix comboBox peut engendrer des modifications dans l'esemble de la tabl
JSlider renderer dans une JTable [ par malawih ]
Bonjour, J ai insere des JSlider dans une colonne d une JTable, en refinissant le renderer et l editor. Le probleme est que les slider ne sont pas mis
afficher contenu d'une table access? [ par spy2008 ]
salut , je veux afficher le contenu d'une table Access dans un JTable ,mon code à la compilation m'affiche cet erreur:G:\BDD\AfficherMessage.java:25
jtable [ par jeeb2009 ]
bonsoir j ai un probleme avec une jtable.. je souhaite la charger et l afficher mais je n ai aucun resultat apres l execution. voici mon code: import
jtable [ par jeeb2009 ]
bonjour a toute la commuanute... voila j ai un code qui me permet de charger une jtable... mais je souhaite afficher cette jtable avec les donnees ch
[JTable] Récupérer l'entête des colonnes [ par greglover ]
Bonjour,je cherche à récupérer l'entete des colonnes de ma Jtable pour qu'ils soient présent dans ma PdfTable.Voici mon code actuelle, il fonctionne t
Livres en rapport
|
Derniers Blogs
UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|