Bonjour à vous, esprits salvateurs.
J'ai une IHM dotée d'une JTable, elle-même dotée d'un modèle de table :
public class MonModèleDeTablePrinc extends AbstractTableModel
Au démarrage, cette table ne montre que quelques lignes bidon, à titre d'exemple (constructeur de
MonModèleDeTablePrinc(String[] titresColonnes)
), mais son contenu peut varier à loisir en fonction du choix d'un fichier .csv adéquat
public void populateTable(File pathNomFichierCsvDEntrée)
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, ...).
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
public class FichierDonnéesDEntrée extends JScrollPane implements ActionListener
, et particulièrement dans sa volumineuse méthode
public void actionPerformed(ActionEvent e)
contenant la structure de traitement des nombreux boutons et radio-boutons.
Voici les lignes de code de mes deux fichiers concernés :
- FichierDonnéesDEntrée
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.
}
... |
- Classe MonModèleDeTablePrinc :
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(); |
, 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()'.
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