Weitere aktuelle Java-Titel finden Sie bei dpunkt.
 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index


8.6.9

JTable



Abbildung 8.41: JTable
Abbildung 8.41

Eine JTable stellt eine Tabelle in Swing dar. Eine Tabelle besteht aus den Spalten, deren Verhalten mittels der Klasse TableColumn eingestellt werden kann, sowie den Tabellenköpfen (JTableHeader), verschiedenen Models, Renderern und Editoren.

Abbildung 8.42: JTable mit sortierbarem Model und eigenem Editor, um Bilder auszusuchen
Abbildung 8.42


Material zum Beispiel

Models

javax.swing.table.TableModelDas TableModel definiert die Daten, die die Tabelle anzeigt. Das Model liefert Aufschluss darüber, welche Werte eine Zelle hat, wobei es auch die Anzahl der Spalten und Zeilen definiert. Abhängig von Zeile und Spalte entscheidet das Model darüber, ob die Zelle editierbar ist, wobei der erfolgreich geänderte Wert mittels setValue(Object value) ins Model zurückgeschrieben wird.

  TableModel model = new AbstractTableModel() {
    String[][] data = new String[] { {"A1","A2"},
                                   {"B1","B2"}});
    public int getRowCount() { return data.length; }
    public int getColumnCount () { return 2; }
    public Object getValueAt (int row, int column) {
      return data[row][column];
    }
  }

Eine besondere Aufmerksamkeit verdient die Methode getColumnClass(int columnIndex). Diese definiert, welcher Klasse die Werte der übergebenen Spalte angehören. Durch diese Klasse entscheidet die Tabelle, welcher Renderer bzw. Editor für diese Zelle zu nehmen ist, je nachdem welcher Renderer bzw. Editor zu diser Klasse assoziiert wurde. Implementiert man beispielsweise nur die fehlenden Methoden des javax.swing.table.AbstractTableModel, so muss man diese Methode überschreiben, wenn ein anderer Renderer oder Editor als der für Strings benutzt werden soll.

javax.swing.table.TableColumnModelDas TableColumnModel kümmert sich um die Verwaltung der einzelnen Spalten (javax.swing.table.TableColumn) und darum, welche Spalte sich an welcher Position befindet (wenn der Benutzer die Reihenfolge der Spalten verändert hat) bzw. welche Spalte selektiert ist. Über die Exemplare der TableColumn-Klasse können die Spaltenbreiten und der Renderer für den Kopf (getHeaderRenderer()) in Erfahrung gebracht werden.
ListSelectionModelDie Auskunft darüber, welche Zeile selektiert ist, liefert das ListSelectionModel (Zugriff über getSelectionModel() bzw. setSelectionModel(ListSelectionModel model)).

Welche Spalte selektiert ist, liefert in der JTable das TableColumnModel.

Renderer

Eine JTable benutzt standardmäßig ein Exemplar der Klasse javax.swing.table.DefaultTableCellRenderer, der von einem JLabel abgeleitet ist und dadurch neben Texten auch ein Icon anzeigen kann.

Das Setzen eines eigenen Renderers kann dabei über zwei Wege erfolgen. Zum einen kann man mithilfe der Methode setDefaultRenderer(Class valueClass, TableCellRenderer renderer) einen Renderer zu einer Klasse assoziieren (also bspw. einen Automobil-Renderer zur Klasse Automobil assoziieren, so dass alle Objekte dieser Klasse durch den passenden Renderer angezeigt werden). Zum anderen kann man in einer abgeleiteten Klasse die Methode getCellRenderer(int row, int column) überschreiben. Durch das Überschreiben hat man die Möglichkeit, einen Renderer je Zelle anzugeben. Liefert die Methode einen null-Wert zurück (der Standard), so wird der Renderer durch die Klasse des Wertes bestimmt.

Die einfachste Möglichkeit, einen eigenen Renderer für eine bestimmte Klasse zu schreiben, besteht darin, den DefaultTableCellRenderer zu erweitern und an die Superklasse einen passenden String als value-Parameter zu übergeben. Die Superklasse zeigt dann mittels toString() diesen Wert in einem JLabel an:

  class MyTableCellRenderer extends 
                      DefaultTableCellRenderer {

    public Component getTableCellRendererComponent(
     JTable table, Object value, boolean isSelected, 
     boolean hasFocus, int row, int column) {
     if (value instanceof Automobil) {
       Automobil automobil = (Automobil) value;
       value = "<html>Marke: "+automobil.getMarke()+
        " / Modell: "+automobil.getModell()+"</html>";
     }
     return super.getTableCellRendererComponent(
       table, value, isSelected, hasFocus, row, column);
    }
  }

Editor

Wie auch beim Renderer kann ein Editor zu einer Datenklasse assoziiert werden oder durch Überschreiben der Methode getCellEditor(int row, int column) pro Zelle definiert werden. Das zugrunde liegende Interface ist TableCellEditor (aus dem Paket javax.swing.table), welches das auch vom JTree benutzte Interface CellEditor erweitert.

Der Ablauf beim Editieren ist der folgende:

Beispiel

// Die Daten als Array von 
// {Bild, Text, Text}
Object[][] data = new Object[][] { 
  {new ImageIcon(getClass().getResource("t1.gif")), 
           "Neu", "Neues Dokument anlegen"}, 
  {new ImageIcon(getClass().getResource("t2.gif")),
           "öffnen", "Vorhandenes Dokument öffnen"}, 
  {new ImageIcon(getClass().getResource("t3.gif")),
           "Speichern", "Speichern des Dokumentes"} 
};
// Die Spaltennamen
Object[] columnNames = new Object[] {"","Name",
                                     "Beschreibung"};
JTable table = new javax.swing.JTable(data, columnNames);
// Für die erste Spalte (Name "") einen Renderer setzen

table.getColumn ("").setCellRenderer(
  // Standard-Renderer erweitern
  new DefaultTableCellRenderer() {
    public Component getTableCellRendererComponent(
      JTable table, Object value, boolean isSelected, 
      boolean hasFocus, int row, int column) {
      // Label der Oberklasse erweitern
      JLabel label = 
          (JLabel) super.getTableCellRendererComponent(
                     table, value, isSelected, hasFocus, 
                     row, column);
      // Lediglich Text und Grafik anpassen
      if (value != null) {
        label.setText("");
        label.setIcon((ImageIcon) value);
      }
      return label;
  }
});


 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index

Copyright © 2002 dpunkt.Verlag, Heidelberg. Alle Rechte vorbehalten.