2016-03-16 3 views
0

Je voudrais créer ma propre méthode qui contrôle quand un composant est 'isSelected'. J'ai un JList contenant plusieurs JPanel. La classe de construction du JPanel extends ListCellRenderer<>.Méthode de remplacement qui fait basculer 'isSelected' dans getListCellRendererComponent

Pour montrer que l'un des composants JList (les JPanels) est sélectionné, j'utilise;

@Override 
public Component getListCellRendererComponent(..., boolean isSelected, ...) { 
    if(isSelected){ 
     setBackground(list.getSelectionBackground()); 
     setForeground(list.getSelectionForeground()); 
    } else { 
     setBackground(list.getBackground()); 
     setForeground(list.getForeground()); 
    } 
    return this; 
} 

Je voudrais une méthode qui maintient un élément sélectionné 'sélectionné' bien que je choisisse d'en sélectionner un autre. Je comprends que cela peut être fait en maintenant CTRL, mais .setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); ne fait pas tout à fait le tour. Je préférerais en sélectionner plusieurs en cliquant dessus, et désélectionner en cliquant dessus.

Pour cela, j'ai travaillé avec le ListSelectionMode, mais je ne trouve pas de solution. Lorsque vous avez fait ce qui précède, je voudrais implémenter une méthode qui sélectionne seulement un composant dans la liste lorsqu'on clique sur une certaine zone (au lieu du composant entier qui est prédéfini). J'ai fait cette méthode, qui retourne vrai si l'on clique sur la bonne zone, sinon faux. Mais comme je n'arrive pas à comprendre comment remplacer le mouseevent qui rend les composants 'isSelected' cela a été difficile.

Voici le code de la méthode que je voudrais remplacer la méthode 'isSelected';

this.addMouseListener(new MouseAdapter() { 
     @Override 
     public void mousePressed(MouseEvent evt) { 
      if(ActionHandler.mouseClickedPrebuild(evt.getPoint())){ 
       //This code runs if that special place is clicked! 
       //So now the component should be 'isSelected' or 
       //deselected if it already was 'isSelected'. 
      } 
     } 
    }); 

Ce code est dans le constructeur de mon JList

Et la méthode mouseClickedPrebuild;

public static boolean mouseClickedPrebuild(Point point) { 
     int index = theJList.locationToIndex(point); 
     Rectangle bounds = theJList.getCellBounds(index,index); 
     Point p = bounds.getLocation(); 
     return (... long list of greater than & less than ...); 
     //This gives the certain area which is accepted to return true 
+0

1. J'ai un JList contenant plusieurs JPanel. == JList (son XxxListModel) n'est pas conçu pour contenir JComponent, ne pas mettre JComponent dans JList (son XxxListModel), 2. à l'intérieur ListSelectionModel vous pouvez basculer ou redéfinir par programmation, 3. Pourquoi raison MouseListener, pour utiliser ListSelectionListener, lire Oracle tutoriel pour l'exemple de code de travail – mKorbel

+0

pour une meilleure aide plus tôt après un SSCCE/MCVE, court, runnable, compilable – mKorbel

+0

@ mKorbel - I utilisé les JComponets pour rendre les éléments de ma liste. Ma conjecture était qu'il doit y avoir un moyen de remplacer le code qui s'exécute lorsque je clique sur un élément de la liste. –

Répondre

0

J'ai résolu le problème!

Donc, je vois ma vue en exécutant cette ligne;

// UI Class JScrollPane    Custom JList 
UIConstructor.listview.setViewportView(new ListView(-insert ArrayList here-)); 

Voici ma ListView. Le DefaultListSelectionModel personnalisé que j'ai utilisé pour résoudre mon problème a été posté par @FuryComptuers ici même;

JList - deselect when clicking an already selected item

je devais faire quelques modifications au code, puisque les deux méthodes dans le selectionModel courront avant mon MouseEvent. J'ai sauvé les variabels de manière statique, donc au lieu d'exécuter le code en setSelectionInterval je l'ai fait à l'intérieur de mon mousePressed.

Je pourrais alors ajouter le booléen isSelected qui renvoie vrai, si une zone de rideau dans un élément de liste spécifique est cliquée.

public class ListViewd extends JList { 

static boolean isSelected; 
static Point point; 

static boolean gS = false; 
static int in0; 
static int in1; 

@Override 
public Dimension getPreferredScrollableViewportSize() { 
    Dimension size = super.getPreferredScrollableViewportSize(); 
    size.setSize(new Dimension(0,0)); 
    return size; 
} 

public ListView(ArrayList<System> items) { 

    DefaultListModel<System> list = new DefaultListModel<System>(); 

    for (System item : items) { 
     list.addElement(item); 
    } 

    this.setSelectionModel(new DefaultListSelectionModel() { 

     boolean gestureStarted = false; 

     @Override 
     public void setSelectionInterval(int index0, int index1) { 
      gS = gestureStarted; 
      in0 = index0; 
      in1 = index1; 

      gestureStarted = true; 
     } 

     @Override 
     public void setValueIsAdjusting(boolean isAdjusting) { 
      if (!isAdjusting) { 
       gestureStarted = false; 
      } 
     } 

    }); 

    ListSelectionModel selectionModel = this.getSelectionModel(); 

    addMouseListener(new MouseAdapter() { 
     @Override 
     public void mousePressed(MouseEvent e) { 
      point = e.getPoint(); 
      isSelected = ActionHandler.mouseClickedPrebuild(point); 

      if(!gS && isSelected){ 
       if (isSelectedIndex(in0)) { 
        selectionModel.removeSelectionInterval(in0, in1); 
       } else { 
        selectionModel.addSelectionInterval(in0, in1); 
       } 
      } 
     } 
    }); 

    setModel(list); 
    setCellRenderer(new ListModelPrebuild()); 
}