Bonjour à vous, esprits salvateurs.
J'ai une IHM dotée d'une JTable, elle-même dotée d'un modèle de table :Au démarrage, cette table ne montre que quelques lignes bidon, à titre d'exemple (constructeur de
Code : Sélectionner tout - Visualiser dans une fenêtre à part public class MonModèleDeTablePrinc extends AbstractTableModel), mais son contenu peut varier à loisir en fonction du choix d'un fichier .csv adéquatMonModèleDeTablePrinc(String[] titresColonnes)De plus, cette table est équipée d'une colonne de tête de lignes contenant leur numérotation, ainsi que d'une table inférieure affichant divers résultats de calculs (totaux, ...).public void populateTable(File pathNomFichierCsvDEntrée)
Je cherche à pouvoir doter d'une couleur de background particulière (LIGHT_GRAY) les rangées situées au-dessus d'une première ligne et en-dessous d'une deuxième ligne, déterminées en les cliquant.
Cette fonctionnalité pourrait intéresser nombre de programmeurs de HMI-Swing, n'est-ce-pas ?
Mon problème : parvenir à rendre 'renderer' atteignable dans toute la classe, et particulièrement dans sa volumineuse méthodepublic class FichierDonnéesDEntrée extends JScrollPane implements ActionListenercontenant la structure de traitement des nombreux boutons et radio-boutons.public void actionPerformed(ActionEvent e)
Voici les lignes de code de mes deux fichiers concernés :
- FichierDonnéesDEntrée- Classe MonModèleDeTablePrinc :
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 public class FichierDonnéesDEntrée extends JScrollPane implements ActionListener { // Déclaration des variables ... private JTable tablePrinc, tableInfér; private int[] sélectionLignes; private TableCellRenderer renderer1; ... private void initGuiComponents(String pathNomFichier) { // Instanciation des variables ... monModèleDeTablePrinc = new MonModèleDeTablePrinc(titresCol_TablePrinc); sélectionLignes = new int[2]; // Sélection par groupe de lignes tablePrinc = new JTable(monModèleDeTablePrinc) { @Override public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { renderer1 = renderer; //? renderer1 n'est qu'une référence recevant copie de la référence d'un renderer instancié au niveau de 'new JTable() , OK ? Component c = super.prepareRenderer(renderer, row, column); if (!isRowSelected(row)) { c.setBackground(getBackground()); if (row < monModèleDeTablePrinc.lignesàEliminer[0] || row > monModèleDeTablePrinc.lignesàEliminer[1]) c.setBackground(Color.LIGHT_GRAY); } return c; } }; ... tablePrinc.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent event) { sélectionLignes = tablePrinc.getSelectedRows(); } } ); ... // GroupLayout // Fin de 'initGuiComponents()' ... @Override public void actionPerformed(ActionEvent e) { int[] parRéf = new int[1]; int enChampDeTexte; if (e.getSource() == radioBouton1) { ... if( (tablePrinc.getSelectedRow() == -1) || sélectionLignes[0]<0 || sélectionLignes[0]> monModèleDeTablePrinc.nbreLignesTotal ) ... { // Une rangée valide du tableau a été préalablement sélectionnée. ... } else { /* Le numéro de ligne (première colonne de la rangée) est identique * à celle du champs de texte à côté du radio-bouton --> * Lancer la commande : Coloration des lignes supérieures */ monModèleDeTablePrinc.lignesàEliminer[0] = sélectionLignes[0]; tablePrinc.prepareRenderer(renderer, sélectionLignes[0], 0); // AUCUN EFFET. } ..., ce qui suffit à faire fonctionner la méthode 'prepareRenderer(...' . Les 'lignesàEliminer[n]' figurent tant dans le constructeur que dans la fonction 'populateTable(File pathNomFichierCsvDEntrée)'. Elles se mettent bien en gris lors de l'appel du constructeur et de 'populateTable()' mais ne se laissent pas modifier ensuite, soit à partir de la méthode 'actionPerformed()'.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 public int[] lignesàEliminer = new int[2]; ... lignesàEliminer[0] = 2; // Lignes au-dessus de lignesàEliminer[1] = nbreLignesTotal-1; // Lignes en-dessous de fireTableDataChanged();
Comment faire pour qu'on puisse relancer le 'renderer' afin qu'il mette en gris les lignes qui précédent la ligne sélectionnée ?
Merci bcp d'avance.
Partager