JTable W. Lang HWR Berlin, SS 2014 1
JTable Die Swing-Komponente JTable dient der Darstellung einer zweidimensionalen Tabelle Verwendung häufig im Zusammenhang mit Datenbankanwendungen Im Gegensatz zu den bisher besprochenen Swing- Komponenten ist die JTable deutlich komplexer Besonders leistungsfähig ist eine JTable, wenn sie eine eigene Klasse zur Verwaltung der Daten anlegen (Model) Das Erstellen einer JTable im GUI-Editor ist teilweise etwas umständlich. Häufig ist es besser, den Java-Code direkt zu editieren Sollte eine neu angelegte Tabelle nicht sichtbar sein, überprüfen sie die Werte der Eigenschaft Bounds W. Lang HWR Berlin, SS 2014 2
Eine einfache Tabelle JTable kennt mehrere Konstruktoren zur Generierung einer Tabelle. Im einfachsten Fall wird lediglich die Anzahl benötigter Zeilen und Spalten als Parameter übergeben, z. B.: JTable tbldemo = new JTable( 5, 5 ); Die Verwaltung der Daten erfolgt hier in einem vordefinierten Tabellenmodell, d. h. durch ein Objekt der Klasse DefaultTableModel, das beim Erstellen der Tabelle automatisch mit angelegt wird Sollen Daten aus dem Programm heraus geändert werden, muss zuerst eine Referenz auf das Tabellenmodell erzeugt werden, z. B.: TableModel tm = tbldemo.getmodel(); W. Lang HWR Berlin, SS 2014 3
Eine einfache Tabelle Mit der Methode setvalueat() kann anschließend ein Wert im Model gesetzt werden, z. B.: tm.setvalueat( "Test", 1, 3 ); Analog kann mit getvalueat() ein Wert ausgelesen werden, z. B.: String s = (String) tm.getvalueat( 1, 3 ); Der Cast ist erforderlich, da getvalueat() keinen String sondern einen Wert vom Typ Object zurück gibt Grundsätzlich kann man auch setvalueat() und getvalueat() von JTable verwenden. Man macht sich dann aber abhängig von Spaltenverschiebungen durch den Anwender Wird ein Wert im Tabellenmodell (Model) geändert, wird die Tabelle (View) darüber informiert (TableModelEvent) und aktualisiert sich selbständig W. Lang HWR Berlin, SS 2014 4
Tabelle mit Scrollbar Können aus Platzgründen nicht alle Zellen angezeigt werden, benötigt die Tabelle Scrollbars Scrollbars werden nicht von der Tabelle selbst, sondern durch die Klasse JScrollPane zur Verfügung gestellt. Dazu erstellen Sie im GUI-Editor zuerst ein Scrollpane und erzeugen die Tabelle dann innerhalb des Scrollpanes Die Tabelle erhält dadurch auch einen Header, dessen Spaltennamen mit Buchstaben vordefiniert sind und der das Verschieben der Spalten durch den Anwender ermöglicht Ob ein horizontaler Scrollbar erzeugt wird oder die Spaltenbreiten angepasst werden, kann über die Tabelleneigenschaft autoresizemode gesteuert werden W. Lang HWR Berlin, SS 2014 5
Tabelle Initialisierung mit Array Eine Tabelle kann auch angelegt werden, indem an den Konstruktor ein zweidimensionales Array vom Typ Object und ein eindimensionales String-Array für die Überschriften übergeben wird. Beispiel: String[] col = { "Nr", "Name" }; Object[][] cells = { }; {1, "Drucker"}, {2, "Monitor"} JTable tbl = new JTable( cells, col ); Sollen die Daten in den Zellen anschließend aus dem Java-Code heraus geändert werden, muss setvalueat() verwendet werden (Nicht direkt ändern! Warum?) W. Lang HWR Berlin, SS 2014 6
Tabelle Spaltenbreite ändern Um die Spaltenbreite zu ändern kann die Klasse TableColumn genutzt werden TableColumn repräsentiert alle Attribute einer Tabellenspalte. Das Objekt für eine bestimmte Spalte erhält man durch TableColumn tc = tbl.getcolumnmodel().getcolumn( colindex ); Die erste Spalte lässt sich jetzt beispielsweise halbieren mit tc.setpreferredwidth( tc.getpreferredwidth() / 2 ); Analog lassen sich auf diese Weise weitere Spaltenattribute ändern W. Lang HWR Berlin, SS 2014 7
Tabelle mit AbstractTableModel Die Erzeugung einer Tabelle mit den Konstruktoren JTable(int, int) und JTable( Object[][], String[]) ist unflexibel und nur für einfache Tabellen geeignet Für anspruchsvollere Anwendungen, insbesondere in Verbindung mit Datenbanken, eignet sich die Variante mit selbst erstelltem Tabellenmodell besser Dabei wird eine Klasse angelegt, die AbstractTableModel erweitert und mindestens folgende drei Methoden implementiert: class MyModel extends AbstractTableModel { public int getrowcount(){...} public int getcolumncount(){...} public Object getvalueat(int r, int c ){...} } W. Lang HWR Berlin, SS 2014 8
Beispiel für Tabelle mit AbstractTableModel Klasse MyModel: class MyModel extends AbstractTableModel { public int getcolumncount(){ return 10; } } public int getrowcount() { return 10; } public Object getvalueat( int row, } int col ) { return new Integer( row * col ); Klasse MyFrame: JTable tbl = new JTable( new MyModel() ); JScrollPane scr = new JScrollPane( tbl ); W. Lang HWR Berlin, SS 2014 9
Weitere Methoden von AbstractTableModel Soll eine eigene Kopfzeile für die Tabelle erstellt werden, ist zusätzlich die Methode public String getcolumnname( int c ){...} zu implementieren Ob eine Zelle editierbar ist, wird über die Methode public boolean iscelleditable( int row, int col ){...} gesteuert Mit den Methoden firetabledatachanged() und firetablecellupdated() der Klasse AbstractTableModel wird die Tabelle (view) darüber informiert, dass sich Daten geändert haben. Sie fragt darauf hin die geänderten Daten neu ab W. Lang HWR Berlin, SS 2014 10
AbstractTableModel aktualisieren Sollen Modelldaten geändert werden, muss das Tabellenmodell um die Methode setvalueat() erweitert werden. Beispiel: public void setvalueat( Object obj, int row, int col ) { zellen[ row ][ col ] = obj; } W. Lang HWR Berlin, SS 2014 11