TableModel (Java API): Unterschied zwischen den Versionen
K (→Implementationen) |
K |
||
(16 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
− | Ein TableModel enthält Daten, welche von einer [[JTable_(Java_API)|JTable]] angezeigt werden. Das ''TableModel'' stellt eine Tabelle, eine gitterförmige Datenstruktur, dar. | + | Ein {{JAPI|TableModel}} enthält Daten, welche von einer [[JTable_(Java_API)|JTable]] angezeigt werden. Das ''TableModel'' stellt eine Tabelle, eine gitterförmige Datenstruktur, dar. |
− | Ein ''TableModel'' kommuniziert mit seiner Aussenwelt über [[TableModelListener_(Java_API)|TableModelListener]]. In einem [[MVC-Pattern]] entspricht es dem ''M''. | + | Ein ''TableModel'' kommuniziert mit seiner Aussenwelt über [[TableModelListener_(Java_API)|TableModelListener]]. In einem [[Entwurfsmuster_(Design_Patterns)#Das_MVC_.28Architekturmuster.29|MVC-Pattern]] entspricht es dem ''M''. |
== Methoden == | == Methoden == | ||
Zeile 9: | Zeile 9: | ||
* '''getRowCount''' liefert die Anzahl Zeilen 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. | * '''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. [[Boolean_(Java)|Boolsche Werte]] werden z.B. mit einer [[JCheckBox_(Java_API)|JCheckBox]] dargestellt, [[ | + | * '''getColumnClass''' liefert den Typ der Einträge einer Spalte. Je nach Typ kann die JTable die Spalte anders darstellen. [[Boolean_(Java)|Boolsche Werte]] werden z.B. mit einer [[JCheckBox_(Java_API)|JCheckBox]] dargestellt, [[String|Strings]] hingegen als Text. |
− | Im folgenden Stück Code wird für die erste Spalte der Typ | + | Im folgenden Stück Code wird für die erste Spalte der Typ {{JAPI|String}}, für die zweite Spalte der Typ [[Integer_(Java_API)|Integer]] angegeben. |
− | < | + | <syntaxhighlight lang="java">public Class<?> getColumnClass( int column ){ |
switch( column ){ | switch( column ){ | ||
case 0: return String.class; | case 0: return String.class; | ||
Zeile 17: | Zeile 17: | ||
default: throw new IllegalArgumentException( "unknown column: " + column ); | default: throw new IllegalArgumentException( "unknown column: " + column ); | ||
} | } | ||
− | }</ | + | }</syntaxhighlight> |
* '''getValueAt''' liefert den Wert einer Zelle. Der Typ dieses Wertes muss der Angabe von ''getColumnClass'' entsprechen. | * '''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 | + | * '''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_(Java_API)|TableCellEditor]] einen Wert verändert hat. | * '''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_(Java_API)|TableCellEditor]] einen Wert verändert hat. | ||
* '''addTableModelListener''' fügt dem Model einen [[TableModelListener_(Java_API)|TableModelListener]] hinzu. Dieser Listener muss immer benachrichtigt werden, wenn sich Daten des Models verändern. Mit Hilfe des [[TableModelEvent_(Java_API)|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. | * '''addTableModelListener''' fügt dem Model einen [[TableModelListener_(Java_API)|TableModelListener]] hinzu. Dieser Listener muss immer benachrichtigt werden, wenn sich Daten des Models verändern. Mit Hilfe des [[TableModelEvent_(Java_API)|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. | ||
Zeile 27: | Zeile 27: | ||
== Implementationen == | == Implementationen == | ||
Es gibt zwei oft benutze Implementationen: | Es gibt zwei oft benutze Implementationen: | ||
− | * Das | + | * Das {{JAPI|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. | |
+ | {{Fragen stellen}} | ||
+ | |||
+ | =Weiterführende Artikel= | ||
+ | *[[JTable (Java API) | JTable]] | ||
+ | *[[JTableHeader_(Java_API) | JTableHeader]] | ||
+ | *[[TableColumnModel_(Java_API) | TableColumnModel]] | ||
+ | *[[TableCellEditor_(Java_API)| TableCellEditor]] | ||
+ | *[[TableCellRenderer_(Java_API)| TableCellRenderer]] | ||
+ | *[[TableColumn_(Java_API)|TableColumn]] | ||
+ | *[[RowSorter_(Java_API)|RowSorter]] | ||
+ | |||
+ | *[[JTable (Tutorial) | JTable-Tutorial©]] | ||
+ | |||
+ | =Links= | ||
+ | *[http://docs.oracle.com/javase/tutorial/uiswing/components/table.html Oracle Tutorial - How to Use Tables] | ||
[[Kategorie:Java_API]] | [[Kategorie:Java_API]] | ||
[[Kategorie:Swing]] | [[Kategorie:Swing]] | ||
− | [[Kategorie: | + | [[Kategorie:JTable]] |
Aktuelle Version vom 28. Mai 2019, 13:24 Uhr
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.
Inhaltsverzeichnis
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.
Fragen
Das Thema wurde nicht ausreichend behandelt? Du hast Fragen dazu und brauchst weitere Informationen? Lass Dir von uns helfen!
- Besuche uns im Byte-Welt-Forum
- Besuche unseren Chat
Wir helfen dir gerne!
Dir hat dieser Artikel gefallen? Oder Du hast Fehler entdeckt und möchtest zur Berichtigung beitragen? Prima! Schreibe einen Kommentar!
Du musst angemeldet sein, um einen Kommentar abzugeben.