Wie ermittelt man einen Eintrag in eine JList?

Eine JList ist bekanntlich nur das View, die visuelle Repräsentation, einer Liste, deren Inhalt durch ein Model verwaltet wird. Möchte man ein Element ermitteln, so muss das Model durchlaufen und der gewünschte Eintrag ermittelt werden.

Das Beispiel zeigt eine einfache JList, der bei der Deklaration ein Model vom Typ DefaultListModel mit drei String-Einträgen übergeben wird. Die JList wird bei einem ListSelectionListener angemeldet, dessen Methode valueChanged(ListSelectionEvent e) eine Schleife enthält, die die Einträge des Models durchläuft. Die untere und obere Grenze des Durchlaufs wird dabei durch Methoden ermittelt, die die Klasse JList bereitstellt. Innerhalb der Schleife wird dann der Index der Selektion registriert und der entsprechende Inhalt der Modelposition ausgegeben.
An dieser Stelle ist eines bemerkenswert: Der ListSelectionListener registriert bei der Auswahl eines Listenelementes zwei Ereignisse, ein Mousedown- und ein Mouseup-Ereignis, von denen nur das erste eine eventuelle Ändereung evoziert. Um ausschließlich dieses Ereignis abzufangen, kann die Methode getValueIsAdjusting() des ListSelectionEvent verwendet werden. Sie gibt einen boolschen Wert zurück, der im Beispiel abgefragt wird.

import java.awt.BorderLayout;

import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class ListenElementErmitteln extends JFrame implements ListSelectionListener {

    JList liste;

    public ListenElementErmitteln() {

        DefaultListModel model = new DefaultListModel();
        model.addElement("eins");
        model.addElement("zwei");
        model.addElement("drei");
        liste = new JList(model);
        liste.addListSelectionListener(this);
        JScrollPane sp = new JScrollPane(liste);

        this.getContentPane().add(sp, BorderLayout.CENTER);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(300, 200);
        this.setVisible(true);
    }
    
    public void valueChanged(ListSelectionEvent e) {
        if (liste.isSelectionEmpty()) {
            return;
        }
        int minIndex = liste.getMinSelectionIndex();
        int maxIndex = liste.getMaxSelectionIndex();
        for (int i = minIndex; i <= maxIndex; i++) {
            if (liste.isSelectedIndex(i) && e.getValueIsAdjusting()) {
                System.out.println(liste.getModel().getElementAt(i));
            }
        }
    }

    public static void main(String[] args) {
        new ListenElementErmitteln();
    }
}