TableModel (Java API)

Aus Byte-Welt Wiki
Wechseln zu: Navigation, Suche

Ein TableModel enthält Daten, welche von einer JTable angezeigt werden. Das TableModel stellt eine Tabelle, eine gitterförmige Datenstruktur, dar.

Ein TableModel kommuniziert mit seiner Aussenwelt über TableModelListener. In einem MVC-Pattern entspricht es dem M.

Methoden

TableModel ist ein Interface welches folgende Methoden vorschreibt:

  • getColumnCount liefert die Anzahl Spalten der Tabelle.
  • getRowCount liefert die Anzahl Zeilen der Tabelle.
  • getColumnName liefert den Namen einer Spalte. Der Name wird über der Spalte in einem speziellen Feld (dem Header) angezeigt.
  • getColumnClass liefert den Typ der Einträge einer Spalte. Je nach Typ kann die JTable die Spalte anders darstellen. Boolsche Werte werden z.B. mit einer JCheckBox dargestellt, Strings hingegen als Text.

Im folgenden Stück Code wird für die erste Spalte der Typ String, für die zweite Spalte der Typ Integer angegeben.

public Class<?> getColumnClass( int column ){
  switch( column ){
    case 0: return String.class;
    case 1: return Integer.class;
    default: throw new IllegalArgumentException( "unknown column: " + column );
  }
}
  • getValueAt liefert den Wert einer Zelle. Der Typ dieses Wertes muss der Angabe von getColumnClass entsprechen.
  • isCellEditable sagt der Tabelle, ob eine bestimmte Zelle durch den Benutzer bearbeitet werden darf. Die Methode getColumnClass bestimmt maßgeblich, wie die Zelle bearbeitet wird; z.B. wird für eine Spalte mit Strings ein Textfeld angeboten.
  • setValueAt ist das Gegenstück zu getValueAt, mit dieser Methode wird der Wert einer Zelle gesetzt. Diese Methode wird von der JTable aufgerufen, nachdem ein TableCellEditor einen Wert verändert hat.
  • addTableModelListener fügt dem Model einen TableModelListener hinzu. Dieser Listener muss immer benachrichtigt werden, wenn sich Daten des Models verändern. Mit Hilfe des TableModelEvents kann eine genau Angabe gemacht werden, welcher Teil des Models sich verändert hat. z.B. könnte eine Zeile gelöscht worden sein, oder der Wert einer Zelle wurde verändert.
  • removeTableModelListener entfernt einen früher hinzugefügten TableModelListener

Implementationen

Es gibt zwei oft benutze Implementationen:

  • Das AbstractTableModel kann als Grundlage eines eigenen TableModels dienen. Insbesondere bietet es Methoden für Verwaltung der TableModelListener_(Java API) an. AbstractTableModel ist eine leichte Art, Daten zu verwenden, die bereits tabellarisch sind. Indem wir drei einfache Methoden (getValueAt, getColumnCount und getRowCount) überschreiben, ist das Tabellenmodell vorhanden. AbstractTableModel liefert auch Ereignisauslösungsmethoden, wie fireTableDataChanged(), fireRowsUpdated(), und so weiter … Die interne Darstellung der Daten kann statisch sein (freie Speicherwahl), oder dynamisch, so dass leistungsfähige Anwendungen resultieren. Durch die Anwendung eines 'Cache' im Vergleich zur Erzeugung des Inhalts für die getValueAt()-Methode, wird die Leistung erheblich in der Anzeige und der Scrollability verbessert.
  • Das DefaultTableColumnModel (Java API) ist ein einfaches vorbereitetes Standard-Daten-Model, bei dem Zellen verändert, Spalten und Zeilen hinzugefügt oder gelöscht werden können. Für die meisten Anwendungen, die nur einige Daten anzeigen möchten, sollte dieses Model vollständig ausreichen. Ohne es im JTable Konstruktor zu spezifizieren, ist DefaultTableModel_(Java API) das benutzte "default" Tabellenmodell. DefaultTableModel's interne Darstellung der Daten ist ein Vektor von Vektoren. Dies ist gut, wenn die verwendeten Daten nicht bereits tabellarisch sind, da die Umwandlung der ursprünglichen Daten eine Performance-Frage ist. Sobald die Daten aber eingestellt sind, sollte die Leistung von Scrollen und Anzeige gut sein, da die Daten gecached sind. Wenn die Daten umfangreich sind, oder wenn sie bereits gecached sind (wie z.B. durch eine Datenbank), dann könnte die Reproduktion der gecached Daten jedoch eine unangebrachte Wahl sein. Ein Vorteil der Anwendung von DefaultTableModel ist seine Mutabilität. Die Implementierung von setValueAt() und seine Zeile/Spalte Modifiziermethoden einschließlich hinzufügen und entfernen, erlauben eine einfache Änderung der Daten nachdem die Tabelle erzeugt wurde. Ein anderer Vorteil ist, dass der Entwurf gut ist, weil alles lokal eingekapselt ist.