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.

Das Beispiel verwendet zwei Klassen. class Liste stellt das GUI bereit, ein von JFrame abgeleitetes Fenster mit Darstellung der Liste, einem Eingabefeld für Änderungen und drei Buttons zum Einfügen neuer und Ändern oder Löschen bestehender Elemente.

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;

public class Liste extends JFrame implements ActionListener {

    private static final long serialVersionUID = 1L;
    JList liste;
    JTextField eingabe;
    JLabel einLabel;
    JPanel einPanel, buttPanel;
    JButton changeButt, addButt, deleteButt;
    JListModel model = new JListModel();

    public 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(model);
        JScrollPane sp = new JScrollPane(liste);

        this.getContentPane().add(einPanel, BorderLayout.NORTH);
        this.getContentPane().add(sp, BorderLayout.CENTER);
        this.getContentPane().add(buttPanel, BorderLayout.SOUTH);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(300, 200);
        this.setVisible(true);
    }

    public static void main(String[] args) {
        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 {

    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.