Eine JList
stellt eine Komponente dar, die die Auswahl
eines oder mehrerer Elemente aus einer Liste erlaubt. Ein separates
JListModel
verwaltet hierbei den Inhalt der Liste.
Die verwendeten JButton werden beim klasseneigenen
ActionListener angemeldet, der jeweils über eine Methode
der Model-Klasse auf die Eingabe der Buttons reagiert. Hierbei
werden Änderungen und neue Einträge nur vorgenommen,
wenn das Textfeld ausgefüllt ist.
Die JList selbst
wird in ein JScrollPane eingebettet, um bei wachsender
Länge ein Scrollen zu ermöglichen. Sie bekommt im
Konstruktor eine Instanz des Models übergeben, das den
Inhalt der Liste verwaltet.
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.AbstractListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class Liste implements ActionListener {
JList<Object> liste;
JTextField eingabe;
JLabel einLabel;
JPanel einPanel, buttPanel;
JButton changeButt, addButt, deleteButt;
JListModel model = new JListModel();
public Liste() {
initGUI();
}
private void initGUI() {
JFrame frame = new JFrame("Liste");
einLabel = new JLabel("eingabe:");
eingabe = new JTextField();
einPanel = new JPanel(new GridLayout(1, 2));
einPanel.add(einLabel);
einPanel.add(eingabe);
changeButt = new JButton("\u00E4ndern");
changeButt.addActionListener(this);
addButt = new JButton("hinzuf\u00FCgen");
addButt.addActionListener(this);
deleteButt = new JButton("l\u00F6schen");
deleteButt.addActionListener(this);
buttPanel = new JPanel(new GridLayout(1, 3));
buttPanel.add(changeButt);
buttPanel.add(addButt);
buttPanel.add(deleteButt);
liste = new JList<Object>(model);
JScrollPane sp = new JScrollPane(liste);
frame.getContentPane().add(einPanel, BorderLayout.NORTH);
frame.getContentPane().add(sp, BorderLayout.CENTER);
frame.getContentPane().add(buttPanel, BorderLayout.SOUTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
frame.setLocation(100, 100);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new Liste());
}
public void actionPerformed(ActionEvent e) {
String txt = eingabe.getText();
if (!txt.equals("") && !txt.startsWith(" ")) {
if (e.getSource() == addButt)
model.addElement(txt);
if (e.getSource() == changeButt)
model.setElement(txt, liste.getSelectedIndex());
}
if (e.getSource() == deleteButt)
model.removeElement(liste.getSelectedIndex());
}
}
class JListModel extends AbstractListModel<Object> {
private static final long serialVersionUID = 1L;
private ArrayList<String> data;
public JListModel() {
data = new ArrayList<String>();
data.add("eins");
data.add("zwei");
data.add("drei");
data.add("vier");
}
public int getSize() {
return data.size();
}
public Object getElementAt(int index) {
return data.get(index);
}
public Object getIndex(Object o) {
return data.indexOf(o);
}
public void setElement(String s, int index) {
data.set(index, s);
update(0, this.getSize());
}
public void addElement(String s) {
data.add(s);
update(this.getSize() - 1, this.getSize());
}
public void removeElement(int index){
data.remove(index);
update(0, this.getSize());
}
public void update(int von, int bis) {
fireIntervalAdded(this, von, bis);
}
}
Das ListModel wird von der abstrakten Klasse AbstractListModel
abgeleitet und deklariert im Konstruktor eine ArrayList, die den
Inhalt des Models und somit der Liste enthält. Ich
beschränke mich hier auf vier Strings,
selbstverständlich sind jedoch auch andere Datentypen
denkbar und möglich.
Die Klasse muss die Methoden getSize()
und getElementAt(int index)
deklarieren.
Die
Methode update(int von, int bis)
verwendet fireIntervalAdded(Object
source, int von, int bis)
um die JList nach
Änderungen auf den neuesten Stand zu bringen, alle anderen
Methoden verwenden intern Verfahren der Collection - hier einer
ArrayList, die vom Model vertreten wird. setElement(String
s, int index)
tauscht einen Eintrag in der Liste aus,
addElement(String s)
fügt einen Eintrag ans
Ende der Liste an und removeElement(int index)
entfernt ein markiertes Element. Jedes Mal muss
anschließend mittels update(int von, int bis)
die JList auf den aktuellen Stand gebracht werden.
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.