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