Frage

eine Weile her, seit ich gepostet hier, und ich bin jetzt an einem Punkt, wo ich mich noch einmal stecken finden.

Für meine Aufgabe an der Uni haben wir gebeten worden, eine Adressbuch-Anwendung zu erstellen. Es läuft gut, und es ist fast abgeschlossen, aber ein Teil des Projekts, die rein meine Präferenz ist, entzieht sich mir. Ich frage nicht, um Hilfe zu jedem Teil der Zuordnung, die mir Mark gewinnen, nur klar zu sein. Ich kann die spec hochladen, wenn jemand Beweis dafür möchte. (/ Offenlegung)

Ein Teil der Anwendung importiert und aus einem benutzerdefinierten Dateityp und das V-Card-Format zu exportieren. Dies funktioniert gut. Der benutzerdefinierte Dateityp hält mehrere Kontakte, mit nur 4 Zeilen pro Kontakt. Da es mehrere Kontakte hält, öffnet sich ein neues Fenster, das den Benutzer auffordert, die Kontakte auszuwählen, sie wollen in die Datei exportiert werden. Diese enthält eine JList, in dem der Benutzer die Kontakte auswählen und exportieren Sie die Datei, kein Problem.

Was habe ich zu tun versucht, ist eine benutzerdefinierte CellRenderers zu schaffen, die die Verwendung eines Kontrollkästchens in der JList ermöglichen. Ich habe fast diese Arbeit von hier auf der Suche ( http: / /java.sun.com/docs/books/tutorial/uiswing/components/combobox.html#renderer ) und hier ( http://www.jroller.com/santhosh/entry/jlist_with_checkboxes ), aber kein Glück. Der erste Link erklärt, wie der benutzerdefinierten CellRenderers zu schaffen, aber nicht Boxs überprüfen und die zweiten erklärt, wie Check Boxs zu tun. Ich kann Scheck Boxs bekommen angezeigt, aber dann ist alles, was angezeigt wird.

Im letzteren Beispiel die Box selbst muß für die Mitglieder der Liste, um angeklickt werden, ausgewählt werden. Was ich möchte in der Lage sein, zu tun ist, damit der Benutzer klicken, um die auf entweder den Listenelementen oder das Kontrollkästchen, um das Element auszuwählen.

In der Version von nur Boxs überprüfen, die ich hatte Arbeit, die Auswahl gearbeitet, jedoch ctrl hatte noch für mehrere Artikel nach unten gehalten werden, ausgewählt werden. Gibt es eine Möglichkeit, es zu machen, so Abfrage nicht für die Mehrfachauswahl von Elementen benötigt wird? Ich weiß, Sie Modifikatoren auf einem Klick lesen können, aber keine Ahnung, wenn man sie mit einem Klick auf ein bestimmtes Objekt anwenden kann.

Ihre Gedanken, Kommentare, Vorschläge, Links und genaue Antworten sind alle sehr willkommen! :)

War es hilfreich?

Lösung

Das tut es, eine Art; obwohl es im Wesentlichen, weil die Kontrollkästchen alles tun, nicht wirklich gefälscht ist, noch überprüft sie den Listeneintrag auswählt.

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

   }

}

Andere Tipps

Ich würde eine JTable verwenden und das Kontrollkästchen als separate Spalte hinzuzufügen.

Sie könnten dann einen Mouselistener zur Tabelle hinzufügen und immer dann, wenn die anderen Spalt überprüfen Sie den Wert der Option wechseln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top