Question

Cela fait un moment que je poste sur ce site et je suis maintenant sur le point de me retrouver à nouveau coincé.

Pour mon affectation à l'université, il nous a été demandé de créer une application de carnet d'adresses. Cela se passe bien et c'est presque terminé, cependant une partie du projet, qui est purement ma préférence, m'échappe. Je ne demande de l'aide pour aucune partie de la mission qui me rapporterait des points, juste pour être clair. Je peux télécharger la spécification si quelqu'un souhaite en avoir la preuve. (/ divulgation)

Une partie de l'application consiste à importer et à exporter à partir d'un type de fichier personnalisé et du format vcard. Cela fonctionne bien. Le type de fichier personnalisé contient plusieurs contacts, avec seulement 4 lignes par contact. Puisqu'il contient plusieurs contacts, une nouvelle fenêtre s'ouvre et demande à l'utilisateur de sélectionner les contacts qu'il souhaite exporter dans le fichier. Il contient une liste JList, dans laquelle l’utilisateur peut sélectionner les contacts et exporter le fichier, sans problème.

Ce que j’essayais de faire, c’est de créer un rendu de cellule personnalisé qui permettra l’utilisation d’une case à cocher dans la liste JList. J'ai presque réussi à travailler 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 procéder aux cases à cocher. Je peux afficher les cases à cocher, mais c’est TOUT ce qui s’affiche.

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

Dans la version des cases à cocher avec lesquelles je travaillais, la sélection fonctionnait, mais ctrl devait néanmoins être maintenu enfoncé pour que plusieurs éléments puissent être sélectionnés. Y a-t-il un moyen de faire en sorte que ctrl ne soit pas nécessaire pour la sélection multiple d'éléments? Je sais que vous pouvez lire les modificateurs sur un clic, mais vous ne savez pas 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! :)

Était-ce utile?

La solution

Cela le fait, en quelque sorte; bien qu’il s’agisse essentiellement de faux, car les cases à cocher ne font rien, mais leur vérification 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);
      }

   }

}

Autres conseils

Je voudrais utiliser un JTable et ajouter la case à cocher en tant que colonne séparée.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top