Domanda

È passato un po 'di tempo da quando ho pubblicato qui, e ora sono in un punto in cui mi ritrovo bloccato di nuovo.

Per il mio incarico presso uni, ci è stato chiesto di creare un'applicazione per la rubrica. Sta andando bene ed è quasi completato, tuttavia una parte del progetto, che è puramente la mia preferenza, mi sfugge. Non sto chiedendo aiuto per nessuna parte del compito che mi farà guadagnare punti, solo per essere chiari. Posso caricare le specifiche se qualcuno vuole prove di ciò. (/ Divulgazione)

Parte dell'applicazione sta importando ed esportando da un tipo di file personalizzato e dal formato vcard. Funziona benissimo. Il tipo di file personalizzato contiene più contatti, con solo 4 righe per contatto. Poiché contiene più contatti, si apre una nuova finestra che chiede all'utente di selezionare i contatti che desiderano esportare nel file. Questo contiene una JList, in cui l'utente può selezionare i contatti ed esportare il file, nessun problema.

Quello che ho cercato di fare è creare un renderer di celle personalizzato che consentirà l'uso di una casella di controllo nella JList. Ho quasi funzionato guardando qui ( http: / /java.sun.com/docs/books/tutorial/uiswing/components/combobox.html#renderer ) e qui ( http://www.jroller.com/santhosh/entry/jlist_with_checkboxes ), tuttavia senza fortuna. Il primo collegamento spiega come creare il renderer di celle personalizzato, ma non le caselle di controllo, mentre il secondo spiega come eseguire le caselle di controllo. Posso visualizzare le caselle di controllo, tuttavia è TUTTO quello che viene visualizzato.

Nell'ultimo esempio, è necessario fare clic sulle caselle stesse per selezionare i membri dell'elenco. Quello che vorrei poter fare è consentire all'utente di fare clic sugli elementi dell'elenco o sulle caselle di controllo per selezionare l'elemento.

Nella versione delle caselle di controllo che ho funzionato, la selezione ha funzionato, tuttavia è stato necessario tenere premuto ctrl per poter selezionare più elementi. Esiste un modo per farlo in modo che ctrl non sia necessario per la selezione multipla di elementi? So che puoi leggere i modificatori con un clic, ma non ho idea se puoi applicarli a un clic di un oggetto specificato.

I tuoi pensieri, commenti, suggerimenti, link e risposte esatte sono tutti benvenuti! :)

È stato utile?

Soluzione

Lo fa, in un certo senso; anche se è essenzialmente falso perché le caselle di controllo non fanno davvero nulla, ma selezionandole si seleziona l'elemento dell'elenco.

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);
      }

   }

}

Altri suggerimenti

Vorrei usare una JTable e aggiungere la casella di controllo come colonna separata.

È quindi possibile aggiungere un MouseListener alla tabella e ogni volta che viene selezionata l'altra colonna, si attiva / disattiva il valore della casella di controllo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top