[Java] Einträge (Properties) einer Tabelle [JTable] editieren

Manchmal ist es sinnvoll Daten in Tabellenform darzustellen und zu editieren. Diese Daten können zum Beispiel so aussehen:

// Blutgruppen
String[] group = { "A", "B", "AB", "0" };

// Personen
Object[][] data =
{
    { "Horst", "Horstmann", 80, "B", false},
    { "Udo", "Schmidt", 90, "0", true },
    { "Lise", "Meier", 65, "AB", false },
    { "Irene", "Lehmann", 72, "A", true }
};

Die zugehörigen Tabellenüberschriften sähen dann beispielsweise so aus:

String[] header = { "Vorname", "Nachname", "Gewicht [kg]", "Blutgruppe", "Mitglied" };

Im nächsten Schritt ist es in Java notwendig sich ein sog. TableModel zu definieren:

/**
 * abgeleitetes TableModel
 * @author admin of codezentrale.de
 */
public class MyTableModel extends AbstractTableModel
{
    private static final int IDX_FIRSTNAME = 0;
    private static final int IDX_LASTNAME = 1;
    /**
     * Spaltenüberschriften
     */
    private final String[] _columns;
    /**
     * Tabellendaten
     */
    private final Object[][] _data;
    /**
     * Tabellenmodell erstellen
     * @param columnTitles Array mit Spaltenüberschriften
     * @param dataEntries Array mit Tabellendaten
     */
    public MyTableModel(String[] columnTitles, Object[][] dataEntries)
    {
        _columns = columnTitles;
        _data = dataEntries;
    }
    /**
     * Anzahl Zeilen der Tabelle
     * @return Anzahl Zeilen der Tabelle
     */
    @Override
    public int getRowCount()
    {
        return _data.length;
    }
    /**
     * Anzahl Spalten der Tabelle
     * @return Anzahl Spalten der Tabelle
     */
    @Override
    public int getColumnCount()
    {
        return _columns.length;
    }
    /**
     * Objekt an der Stelle ermitteln [row, col]
     * @param row Zeilenindex
     * @param col Spaltenindex
     * @return Objekt an der Stelle [row, col]
     */
    @Override
    public Object getValueAt(int row, int col)
    {
        return _data[row][col];
    }
    /**
     * Spaltenname ermitteln
     * @param col Spaltenindex
     * @return Spaltenname
     */
    @Override
    public String getColumnName(int col)
    {
        return _columns[col];
    }
    /**
     * Objektklasse einer Spalte ermitteln
     * @param col Spaltenindex
     * @return Objektklasse einer Spalte
     */
    @Override
    public Class getColumnClass(int col)
    {
        return getValueAt(0, col).getClass();
    }
    /**
     * Ist eine angeklickte Zelle editierbar?
     * @param row Zeilenindex
     * @param col Spaltenindex
     * @return Ist eine angeklickte Zelle editierbar?
     */
    @Override
    public boolean isCellEditable(int row, int col)
    {
        // 1. und 2. Spalte (Vorname, Nachname) sind nicht editierbar
        return ((col != IDX_FIRSTNAME) && (col != IDX_LASTNAME));
    }
    /**
     * Objekt an der Stelle setzen [row, col]
     * @param value Objektwert
     * @param row Zeilenindex
     * @param col Spaltenindex
     */
    @Override
    public void setValueAt(Object value, int row, int col)
    {
        _data[row][col] = value;
    }
}

Auf einem Formular (JFrame) sollte nun ein JScrollPane und in diesen hinein eine JTable namens „jTable1“ plaziert werden. Folgender Code fügt die weiter oben angegebenen Personendaten in die Tabelle ein:

// Tabellenmodell erstellen
TableModel model = new MyTableModel(header, data);

// Modell der Table übergeben
jTable1.setModel(model);
// Spalten erzeugen
jTable1.createDefaultColumnsFromModel();

// Combobox mit Blutgruppen für die 4. Spalte erzeugen und setzen
JComboBox comboBox = new JComboBox(group);
jTable1.getColumnModel().getColumn(3).setCellEditor(new DefaultCellEditor(comboBox));

Durch einen simplen Doppelklick auf eine Tabellenzelle ist nun der Tabelleninhalt editierbar. Im Tabellenmodell ist hier besipielhaft in der Funktion isCellEditable die 1. und 2. Spalte der Tabelle für das editieren gesperrt.

Weiterführende Informationen gibt es hier: Link