8.6.3 | JList |
Eine JList zeigt mehrere Zeilen mit Daten gleichzeitig an, wobei kein, ein oder mehrere Elemente selektiert sein können. Ansonsten verhält sich eine JList identisch wie eine JComboBox. Diese Ähnlichkeit kennt man beispielsweise auch von HTML: Das select-Tag ist eine JComboBox, wenn nur ein Element angezeigt wird (size="1"). Wenn mehr Elemente angezeigt werden (size >=2), wird eine Liste gezeigt, die auch Mehrfachselektion zulässt.
Der Selektionsmodus wird mittels setSelectionMode(int mode) gesetzt. Mögliche Werte dabei sind
- ListSelectionModel.SINGLE_SELECTION
Es kann nur ein Datum zu einer Zeit selektiert werden- ListSelectionModel.SINGLE_INTERVAL_SELECTION
Es können mehrere Daten gleichzeitig selektiert werden, die aber zusammenhängen müssen- ListSelectionModel.MULTIPLE_INTERVAL_SELECTION
Es können beliebig viele Daten an beliebigen Stellen selektiert werden
Seit der Version1.4 besitzt eine JList die Möglichkeit, die Daten nicht nur vertikal untereinander anzuzeigen, sondern zusätzlich in mehreren Spalten. Dafür ist die Methode setLayoutOrientation(int orientation) zuständig. Folgende Werte sind dafür zulässig:
- JList.VERTICAL
Das Standardverhalten, welches auch als einziges vor der Version 1.4 zur Verfügung stand. Hier gibt es nur eine Spalte, und alle Datenelemente werden untereinander angezeigt.- JList.VERTICAL_WRAP
Die Daten werden folgendermaßen angezeigt:1 4 7 2 5 8 3 6 9Die Anzahl der Spalten berechnet sich aus der Anzahl der Daten und der Anzahl der sichtbaren Zeilen, die die Methode getVisibleRowCount() liefert. Dieser Wert ist standardmäßig 8. Hat man also beispielsweise 40 Daten anzuzeigen und der Wert der Zeilen ist 8, so ergibt dies 5 Spalten. Es existiert dabei keine obere Grenze für die Spaltenanzahl.- JList.HORIZONTAL_WRAP
Die Daten werden folgendermaßen angezeigt:1 2 3 4 5 6 7 8 9Ansonsten verhält sich das Layout wie bei einem VERTICAL_WRAP.
Möchte man auf einen Doppelklick auf ein Element reagieren, beispielsweise um dieses Element auszuwählen, muss man einen MouseListener registrieren:
list.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) System.out.println("Index "+ ((JList) e.getSource()). locationToIndex(e.getPoint())+ " wurde ausgewählt"); } });
Datenmodell In der JList kann eine Implementierung des Interface ListModel mittels setModel(ListModel model) gesetzt werden. Dieses Model beinhaltet im Gegensatz zur JComboBox keine Informationen darüber, welche Elemente selektiert sind. Selection Model Aufgrund der Komplexität der Selektionsmöglichkeiten gibt es bei der JList im Gegensatz zur JComboBox ein zusätzliches Model für die Selektion. Typischerweise benötigt der Programmierer dort keine Erweiterungen, so dass eine set-Methode für das Model fehlt. Wer es dennoch setzen möchte, muss die Methode createSelectionModel() in der JList überschreiben.
Der Renderer ist wie bei der JComboBox eine Implementierung des Interface ListCellRenderer und kann mit der Methode setRenderer(ListCellRenderer renderer) gesetzt werden.
JList list = new JList(new Object[] { new ImageIcon("apfel.gif"), new ImageIcon("kuerbis.gif"), new ImageIcon("paprika.gif"), new ImageIcon("tomate.gif") }); list.setVisibleRowCount(3); getContentPane ().add(new JScrollPane(list)); list = new JList (new Object[] { "Apfel", "Kürbis", "Paprika", "Tomate" }); list.setVisibleRowCount(3); getContentPane().add(new JScrollPane(list));