Rendre élément d'une JList non sélectionnable ?

Rendre élément d'une JList non sélectionnable ? - Java - Programmation

Marsh Posté le 27-07-2009 à 13:35:50    

Bonjour,
 
Comme le titre l'indique, j'aimerais savoir s'il est possible de rendre certains éléments d'une JList non sélectionnables ?
 
Ainsi, on aurait une JList qui s'affiche dans un premier temps avec tous les éléments sélectionnables (les éléments étant des noms de fichiers). Puis, après chargement du répertoire de fichiers, si certains ne sont pas présents les éléments de la liste correspondants seraient grisés (ou en tout cas non cliquables).
 
J'ai vu pas mal de choses pour agir sur toute la JList (setEnabled), ou encore pour enlever des éléments mais rien pour agir uniquement sur la "sélectionnabilité" de certains éléments (sans modifier la structure globale de la JList donc)...
 
Merci d'avance !

Reply

Marsh Posté le 27-07-2009 à 13:35:50   

Reply

Marsh Posté le 19-03-2010 à 16:40:28    

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 :
  1. public class MaJList extends JList {
  2. /**
  3.  * Cette liste propose de gérer une liste d'index qui permet  
  4.  * d'appliquer un traitement particuler à ces index.
  5.  */
  6. private ArrayList<Integer> indexSet = new ArrayList<Integer>();
  7. public ParamJList() {
  8.  super();
  9.   // pour utiliser le rendu des cellules qui suit
  10.   this.setCellRenderer(new ListGeneralParameterItem(this.listParametres));
  11. }
  12. public void addIndex(int Item) {
  13.  this.indexSet.add(Item);
  14. }
  15. public ArrayList<Integer> getIndexSet() {
  16.  return indexSet;
  17. }
  18. public void removeIndex(int Item) {
  19.  this.indexSet.remove((Object)Item);
  20. }
  21. public void removeAllIndex() {
  22.  this.indexSet.clear();
  23. }
  24. }


 
Je redéfinis le rendu des items qui sont en fait des JLabel :

Code :
  1. public class MonListItem extends JLabel implements ListCellRenderer {
  2. private MaJList parent;
  3. public MonListItem(MaJList parent) {
  4.  setOpaque(true);
  5.  this.parent = parent;
  6. }
  7. @Override
  8. public Component getListCellRendererComponent(JList list, Object value,
  9.   int index, boolean isSelected, boolean cellHasFocus) {
  10.  setText(value.toString());
  11.  setBackground(isSelected ? Color.black : Color.white);
  12.         setForeground(isSelected ? Color.white : Color.black); 
  13.  if (this.parent.getIndexSet().contains(index)) {
  14.   this.setEnabled(false);
  15.   setBackground(Color.white);
  16.  }
  17.  else this.setEnabled(true);
  18.  return this;
  19. }
  20. }


 
Dans mon JPanel ou ma JFrame, je crée ma list comme ça :

Code :
  1. 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...  :pfff: 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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed