TableColumn: Innehåller information om hur en kolumn
ritas på skärmen, till exempel max- och minbredd, om användaren
får ändra dess storlek samt objekt som används för att
rita upp och editera celler.
TableColumnModel: Endast en för hela tabellen, inte
en per kolumn. Den hanterar markerade kolumner och innehåller en förteckning
över alla kolumner samt även kolumnmarginal.
TableModel: Innehåller framför allt tabellens
data, dvs själva innehållet i cellerna. Den hanterar dessutom
kolumnrubriker och kolumntyp (dvs vilken klass kolumnens objekt är av)
samt antal rader och kolumner.
JTable: Innehåller referenser till modellerna och
speglar en del information därifrån. Den hanterar också
markeringar och innehåller information om hur tabellen ritas (rutnät,
färger, radhöjd osv).
Vi börjar med ett mycket enkelt exempel och bygger sedan på det. Klassen JTable har ett antal konstruktorer där data eller storlek kan anges direkt. I exemplet ges data som en tvådimensionell array av Object, SimpleTable.java.
TableColumnModel innehåller metoder för att till exempel flytta och ta bort kolumner. En intressant metod är getColumnIndexAtX() som talar om vilken kolumn som finns vid en viss pixel, och alltså kan användas för att avgöra vilken kolumn användaren klickat på. Ett TableColumnModelEvent skickas när något hänt med en kolumn, se exemplet. Den hanterar även kolumnmarkeringar och skickar ett ListSelectionEvent när markeringen ändras. Som framgår av exemplet är det bättre att fråga kolumnmodellen efter aktuell markering än att fråga eventet. Lägg märke till metoden ListSelectionEvent.getValueIsAdjusting() som talar om i fall användaren är färdig med en markering.
Property columnMargin syftar på avståndet mellan cellerna, inte på rutnätets bredd.
Och så till sist exemplet: ColumnExample.java.
AbstractTableModel innehåller stöd för att skicka TableModelEvent när tabellens innehåll förändrats, men vi måste själva skriva anropen av de metoder som skickar eventet. Här är ett litet exempel på en egen modell, MyTableModel.java.
Om vi trots allt bestämmer oss för att inte skriva en egen modell används DefaultTableModel, vilken sparar datat som en Vector av Vectorer. Den omdefinierar isCellEditable(), se ovan, till att alltid returnera true. Dessutom tillför den en massa metoder för att hantera tabellens data, både cellvis, radvis, kolumnvis och som helhet. Dessa metoder skickar dessutom verkligen TableModelEvent när tabellens innehåll förändras.
Till sist ett litet exempel som ökar på avståndet mellan cellerna, tillåter markering av enskilda celler istället för rader och programmatiskt startar editering av en cell när användaren trycker på knappen "edit", JTableTest.java. Exemplet lyssnar även efter TabelModelEvent och TabelColumnModelEvent. Observera att ChangeEvent bara skickas när det sker en ändring av markerade kolumner.