Bonjour,
J'espère que tu as trouvé une solution depuis le temps. J'ai eu le même problème que toi et je n'ai pas trouvé grand chose sur la toile pour m'aider donc voici ma solution, qui n'est peut-être pas optimale mais qui fonctionne :
Je redéfinis ma liste pour qu'elle possède une "sous-liste" d'index :
Code :
- public class MaJList extends JList {
- /**
- * Cette liste propose de gérer une liste d'index qui permet
- * d'appliquer un traitement particuler à ces index.
- */
- private ArrayList<Integer> indexSet = new ArrayList<Integer>();
- public ParamJList() {
- super();
- // pour utiliser le rendu des cellules qui suit
- this.setCellRenderer(new ListGeneralParameterItem(this.listParametres));
- }
- public void addIndex(int Item) {
- this.indexSet.add(Item);
- }
- public ArrayList<Integer> getIndexSet() {
- return indexSet;
- }
- public void removeIndex(int Item) {
- this.indexSet.remove((Object)Item);
- }
- public void removeAllIndex() {
- this.indexSet.clear();
- }
- }
|
Je redéfinis le rendu des items qui sont en fait des JLabel :
Code :
- public class MonListItem extends JLabel implements ListCellRenderer {
- private MaJList parent;
- public MonListItem(MaJList parent) {
- setOpaque(true);
- this.parent = parent;
- }
- @Override
- public Component getListCellRendererComponent(JList list, Object value,
- int index, boolean isSelected, boolean cellHasFocus) {
- setText(value.toString());
- setBackground(isSelected ? Color.black : Color.white);
- setForeground(isSelected ? Color.white : Color.black);
- if (this.parent.getIndexSet().contains(index)) {
- this.setEnabled(false);
- setBackground(Color.white);
- }
- else this.setEnabled(true);
- return this;
- }
- }
|
Dans mon JPanel ou ma JFrame, je crée ma list comme ça :
Code :
- MaJList list = new MaJList();
|
Et je peux directement utiliser les fonctions d'ajout ou de suppression des items de la liste des items non sélectionnables dans le JPanel ou la JFrame...
J'ai juste un petit problème de rafraîchissement : je n'arrive pas à rafraîchir automatiquement l'affichage de la liste après.
Voilà, j'espère que ça pourra aider des gens !!
EDIT : Oups ! J'allais oublier une partie importante du travail, parce que là, si vous testez, les items sont de la bonne couleur (grisés) mais encore cliquables... honte à moi...
En effet le CellRenderer ne gère que le rendu des cellules comme son nom l'indique. Et il faut donc encore vérifier dans les bon listeners (ceux qu'on appelle quand on clique sur l'item) que l'élément sélectionné n'appartient pas à la liste des éléments non cliquables... et si c'est le cas on ne fais rien !
Bon je ne sais pas si je suis très claire mais comme je suis rentrée du boulot je n'ai plus le code sous les yeux. Promis, lundi je fignole tout ça !
Message édité par neftyce le 19-03-2010 à 17:56:28