# JTable - TableModel aus ArrayList



## gladiator09 (8. Mai 2008)

hey leute!

wie mach ich eine jtable aus einer arraylist??

lg,
gladiator


----------



## André Uhres (8. Mai 2008)

Ähnlich wie mit einem Vector: http://developer.classpath.org/doc/javax/swing/table/DefaultTableModel-source.html
Du kannst auch einfach dem DefaultTableModel einen Vector übergeben, den du aus der ArrayList erzeugst :wink:


----------



## gladiator09 (9. Mai 2008)

ok, also ich mach aus der arraylist einen vector und wenn ich in der jtable dann daten ändere, ändert der die dann automatisch in der arraylist??

lg


----------



## Marco13 (9. Mai 2008)

Nein. Für das, was du vorhast, musst du vermutlich das ListModel verwenden. Bietet "ähnliche" Funktionen wie eine ArrayList, und hat das beschriebene Verhalten. Wenn's drauf ankommt kannst du dir auch eine "List"-Implementierung schreiben, die mit einem ListModel verdengelt ist.


----------



## gladiator09 (9. Mai 2008)

ja aber dann muss ich eine JList machen und kann keine JTable machen oder??

lg


----------



## Marco13 (9. Mai 2008)

Ach sorry - TableModel statt ListModel. Man könnte das ganze zwar auch von einem TableModel an eine List weiterreichen, oder sogar ein TableModel machen, das für jede Spalte (bzw. für jedes ColumnModel) eine List enthält, aber wie viel Sinn das macht, ist eine andere Frage. Weiß ja keiner, worum's geht.


----------



## gladiator09 (9. Mai 2008)

naja, ich hab eine arraylist mit lauter objekten drin...

das objekt ist schüler mit 4 datenfelder...

und jetzt will ich eine JTable machen, die mir das anzeigt, also:

jeder schüler eine zeile und jede spalte ein datenfeld!

z.b.: 15 objekte von schüler in der arraylist und jedes 4 datenfelder = 15 zeilen, 4 spalten!

wie kann ich das jetzt machen, dass ich diese arraylist in ein TableModel "stecke" und wenn die JTable geändert wird, das auch direkt in der arraylist passiert...

lg


----------



## André Uhres (10. Mai 2008)

Hier ist ein einfaches Beispiel von einem TableModel mit ArrayList 
(oder jede andere Collection, die das List interface implementiert).
Mit "setRowList" kannst du deine ArrayList übergeben:

```
package tablesave;
/*
 * STableModel
 * source level 1.4
 */
import java.util.*;
import java.util.List;
import javax.swing.table.*;
public class STableModel extends AbstractTableModel {
    private List rowList;
    public static final int NAME = 0;
    public static final int PHONE = 1;
    private String[] headers = {"Name","Phone"};
    public STableModel() {
        rowList = new ArrayList();
    }
    public int addElement(final STableRow rowData) {
        rowList.add(rowData);
        this.fireTableDataChanged();
        return rowList.size()-1;
    }
    public void removeElement(final STableRow rowData) {
        rowList.remove(rowData);
        this.fireTableDataChanged();
    }
    public void setEntries(final List dataList) {
        clear();
        for (int row = 0; row < dataList.size(); row++) {
            rowList.add(dataList.get(row));
        }
    }
    public String getColumnName(int i) {return headers[i];}
    public int getColumnCount() {return headers.length;}
    public int getRowCount() {return rowList.size();}
    public Object getRowAt(int row) {return rowList.get(row);}
    public void setRowAt(final STableRow rowData, int row) {
        rowList.set(row, rowData);
        this.fireTableRowsUpdated(row, row);
    }
    public Object getValueAt(final int row, final int col) {
        if(col == NAME)
            return ((STableRow)rowList.get(row)).getName();
        if(col == PHONE)
            return ((STableRow)rowList.get(row)).getPhone();
        return (Object) null;
    }
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        if(columnIndex == PHONE) return true;
        return false;
    }
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        if(columnIndex == NAME)
            ((STableRow)rowList.get(rowIndex)).setName((String) aValue);
        if(columnIndex == PHONE)
            ((STableRow)rowList.get(rowIndex)).setPhone((String) aValue);
    }
    public void clear() {
        int rows = getRowCount();
        rowList.clear();
        fireTableRowsDeleted(0,rows);
    }
    public String[] getHeaders() {return headers;}
    public List getRowList() {return rowList;}
    public void setHeaders(final String[] headers) {this.headers = headers;}
    public void setRowList(final List rowList) {this.rowList = rowList;}
}
```
Du musst nur "STableRow" durch deine "Schüler" Klasse ersetzen
und die Spaltennamen anpassen.


----------



## gladiator09 (10. Mai 2008)

ok, werd mir das mal anschauen 

danke,
gladiator


----------

