2009-11-26 27 views
0

Ça fait un bout de temps que j'ai posté sur ici, et maintenant je suis à un point où je me retrouve coincé encore une fois.JList contenant JCheckBox et une chaîne, avec sélection de clic non ctrl?

Pour ma mission chez uni, on nous a demandé de créer une application de carnet d'adresses. Ça se passe bien, et c'est presque terminé, mais une partie du projet, qui est purement ma préférence, m'échappe. Je ne demande pas d'aide pour une partie de la mission qui me rapportera des points, juste pour être clair. Je peux télécharger la spécification si quelqu'un veut des preuves de cela. (/ disclosure)

Une partie de l'application consiste à importer et exporter depuis un type de fichier personnalisé et le format vcard. Cela fonctionne bien. Le type de fichier personnalisé contient plusieurs contacts, avec seulement 4 lignes par contact. Comme il contient plusieurs contacts, une nouvelle fenêtre s'ouvre demandant à l'utilisateur de sélectionner les contacts qu'il souhaite exporter dans le fichier. Cela contient un JList, où l'utilisateur peut sélectionner les contacts et exporter le fichier, pas de problème.

Ce que j'ai essayé de faire, est de créer un rendu de cellule personnalisé qui permettra l'utilisation d'une case à cocher dans le JList. J'ai presque eu ce travail en regardant ici (http://java.sun.com/docs/books/tutorial/uiswing/components/combobox.html#renderer) et ici (http://www.jroller.com/santhosh/entry/jlist_with_checkboxes), mais pas de chance. Le premier lien explique comment créer le rendu de cellule personnalisé, mais pas les cases à cocher, et le second explique comment faire les cases à cocher. Je peux obtenir des cases à cocher à afficher, mais alors c'est tout ce qui s'affiche.

Dans le dernier exemple, les cases elles-mêmes doivent être cliquées pour que les membres de la liste soient sélectionnés. Ce que j'aimerais pouvoir faire, c'est permettre à l'utilisateur de cliquer sur les éléments de la liste ou sur la case à cocher pour sélectionner l'élément.

Dans la version des cases à cocher que je travaillais, la sélection fonctionnait, mais ctrl devait encore être maintenu pour plusieurs éléments à sélectionner. Y at-il un moyen de le faire si ctrl n'est pas nécessaire pour la sélection multiple d'éléments? Je sais que vous pouvez lire les modificateurs sur un clic, mais aucune idée si vous pouvez les appliquer à un clic d'un objet spécifié.

Vos pensées, commentaires, suggestions, liens et réponses exactes sont les bienvenus! :)

Répondre

1

Cela fonctionne, en quelque sorte; Bien que ce soit essentiellement faux parce que les cases à cocher ne font vraiment rien, encore en les vérifiant sélectionne l'élément de la liste.

import java.awt.Component; 
import java.awt.FlowLayout; 

import javax.swing.BoxLayout; 
import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JList; 
import javax.swing.JPanel; 
import javax.swing.ListCellRenderer; 


public class Relequestual extends JFrame { 

    private final FunkyCellRendererComponent funkyCRC = new FunkyCellRendererComponent(); 

    public Relequestual() { 
     getContentPane().setLayout(new FlowLayout()); 

     String[] items = { "Item 1", "Item 2", "Item 3", "Item 4" }; 
     JList theList = new JList(items); 
     theList.setCellRenderer(
     new ListCellRenderer() { 
     @Override 
     public Component getListCellRendererComponent(JList list, Object value, int index, 
       boolean isSelected, boolean cellHasFocus) { 
      funkyCRC.setup(list, value, index, isSelected, cellHasFocus); 
      return funkyCRC; 
     } 
     }); 
     getContentPane().add(theList); 

    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     Relequestual gui = new Relequestual(); 
     gui.pack(); 
     gui.setVisible(true); 
    } 

    class FunkyCellRendererComponent extends JPanel { 

     private JCheckBox checkBox = new JCheckBox(); 
     private JLabel label = new JLabel(); 
     private JList list; 
     private int index; 

     public FunkyCellRendererComponent() { 
     super(null); 
     setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); 
     add(this.checkBox); 
     add(this.label); 
     } 

     public void setup(JList list, Object value, int index, 
       boolean isSelected, boolean cellHasFocus) { 
     this.list = list; 
     this.index = index; 
     this.label.setText((String) list.getModel().getElementAt(index)); 
     if (isSelected) { 
      setForeground(list.getSelectionForeground()); 
      setBackground(list.getSelectionBackground()); 
     } else { 
      setForeground(list.getForeground()); 
      setBackground(list.getBackground()); 
     } 
     this.checkBox.setSelected(isSelected); 
     } 

    } 

} 
+0

Par votre description, c'est exactement ce que je veux faire, car j'ai déjà une méthode pour trouver les éléments sélectionnés dans la liste. Je vais vérifier le matin. – Relequestual

0

Je voudrais utiliser un JTable et ajouter la case à cocher dans une colonne séparée.

Vous pouvez ensuite ajouter un MouseListener à la table et chaque fois que l'autre colonne est cochée, vous pouvez basculer la valeur de la case à cocher.

+0

Oui, semble si simple maintenant vous le dites. Aucune idée pourquoi je n'ai pas pensé à ça. Néanmoins, il est dit que vous devriez être capable de créer un rendu de cellule personnalisé qui contient une case à cocher. Je vais essayer cette idée demain. Toujours envie d'entendre ce que les autres ont à dire. – Relequestual