Pronux Wiki
Menu

RCPUnterstützungVonTabellen

Spring RCP stellt Hilfs- und Standardklassen für die Arbeit mit Tabellen bereit.

Table Models

Wenn man eine Tabelle verwenden will, aknn man jede beliebeige Implemenetierung des TableModels verwenden, allerdins werden 2 Hilfsklassen vom RCP Projekt angeboten, das BeanTableModel und das ListTableModel.

Wenn man eine dieser Klassen nutzt, wird eine Extraspalte zur Tabelle hinzugefügt, welche den Zeilenindex anzeigt. Um diese auszuschalten, muss man die Methode model.setRowNumbers(boolean) nutzen.

Um den Editiermodus der Zellen einer Tabelle zu kontrollieren, muss man die Methode isCellEditableInternal überschreiben.

ListTableModel model = new ListTableModel(rows)
 {
  ... // other methods ommitted

   public boolean isCellEditableInternal(int rowIndex, int columnIndex) 
    {
     // the second column is editable
     return columnIndex == 1;
   }
 };

BeanTableModel

Das BeanTableModel wird genutzt, um eine Liste von Beans in einer Tabelle anzuzeigen. Ein BeanTableModel benötigt eine Bean Klasse, eine Liste von Beans und eine Message Source.

Beispiel

Die Customer bean:

public class Customer 
{
 private String name;
 private String number;

 public String getName() 
 {
  return name;
 }

 public void setName(String name) 
  {
   this.name = name;
  }

 public String getNumber() 
 {
  return name;
 }

 public void setNumber(String number) 
 {
  this.number = number;
 }
}

Und nun zur BeanTableModelimplementierung: Zwei Methoden müssen überschrieben werden, createColumnPropertyNames und createColumnClasses.

Die Methode createColumnPropertyNames gibt einen Array von Attributnamen zurück (z.B. number und name) und die Methode createColumnClasses gibt einen Array von Attributtypen zurück.

public class CustomerTableModel extends BeanTableModel 
{

 public CustomerTableModel(MessageSource messageSource) 
  {
   super(Customer.class, messageSource);
  }

 protected String[] createColumnPropertyNames() 
  {
   return new String[] { "number", "name" };
  }

  protected Class[] createColumnClasses() 
  {
   return new Class[] { String.class, String.class };
  }
}

Die Viewimplementierung:

protected JComponent createControl() 
{
 // fetch the customer store
 CustomerStore store = ...;

 // fetch the messageSource instance from the application context
 MessageSource messageSource = (MessageSource) getApplicationContext().getBean("messageSource");
 // create the CustomerTableModel
 BeanTableModel tableModel = new CustomerTableModel(messageSource);
 tableModel.setRows(store.getCustomers());

 // create the JTable instance
 JTable table = TableUtils.createStandardSortableTable(tableModel);
 return new JScrollPane(table);
}
Die Datei messages.properties enthält die Labels und die Spaltenüberschriften für die Tabelle.
customer.number=Number
customer.name=Name

ListTableModel

Mit einem ListTableModel kann man ein TableModel aus einer Liste von Objekten, Listen oder Arrays erzeugen.

Dies funktioniert folgendermassen:

  • Mehr als 1 Spalte:
    • Reihen sind Arrays: Die Splaten Indizes korrespondieren mit den Array Indizes
    • Reihen sind Listen: Die Splaten Indizes korrespondieren mit den List Indizes
    • Reihen sind Objekte: Eine IllegalArgumentException wird geworfen
  • 1 Spalte
    • Reihen sind Arrays: Der Wert beim Index 0 des Arrays wird genutzt
    • Reihen sind Objekte: Das Objekt selbst wird verwendet

Beispiel

Man will eine Liste von Arrays anzeigen:

List rows = new ArrayList();
rows.add(Arrays.asList("000001", "Apple"));
rows.add(Arrays.asList("000002", "Sun"));
rows.add(Arrays.asList("000002", "IBM"));

 ListTableModel model = new ListTableModel(rows)
 {
  protected Class[] createColumnClasses() 
  {
   return new Class[] { String.class, String.class };
  }

  protected String[] createColumnNames() 
  {
   return new String[] { "Number", "Name" };
  }
 };

Ergebnis:

Number Name
000001 Apple
000002 Sun
000003 IBM

Beispiel

Man will eine Liste von Objekten in einer Tabelle mit einer Spalte anzeigen:

List rows = new ArrayList();
rows.add("Apples");
rows.add("Bananas");
rows.add("Kiwis");

ListTableModel model = new ListTableModel(rows)
 {
  protected Class[] createColumnClasses() 
   {
    return new Class[] { String.class };
   }

   protected String[] createColumnNames() 
    {
     return new String[] { "Fruit" };
    }
  };

Ergebnis:

Fruit
Apples
Bananas
Kiwis

Table Rendering

Einige Standard Cellrenderer sind installiert, wenn man eine Tabelle mit der TableUtils Klasse erzeugt.

  • Objekte: BeanTableCellRenderer
  • CodedEnums: CodedEnumTableCellRenderer
  • Date: DateTimeTableCellRenderer
  • Boolean: BooleanTableCellRenderer()

Um einen eigenen Renderer zu installieren oder den DefaultRenderer zu überschreiben, muss man folgendes tun:

JTable table = TableUtils.createStandardSortableTable(model);
table.setDefaultRenderer(Date.class, new DateTimeTableCellRenderer(new SimpleDateFormat("dd/MM/yyyy")));

TODO: write your own renderer class

Editable Tables

TODO

Sortable Tables

Man kann eine sortierbare Tabelle erzeugen, indem man die Methode TableUtils.createStandardSortableTable nutzt. Alle Spalten werden dadurch sortierbar. Falls eine Spaltenklasse nicht Comparable implementiert, wird die toString() Implementierung des Wertes für den Vergleich genutzt. Ein SortableTableModel umgibt dann das eigene Model und kümmert sich um die Sortierung. Das eigene TableModel wird nie geändert, wenn ein User nach einer Spalte sortiert!

Man muss sich selbst um die Konvertierung von ReihenIndizes der Tabelle zu Reihenindizes des Models kümmern.

Man kann die Methoden getSelectedRow(JTable) und getSelectedRows(JTable) der Hilfsklasse TableUtils nutzen.

public class TestTableView extends AbstractView 
{
 private ListTableModel model;
 private JTable table;

 protected JComponent createControl() 
  {
   model = ...
   table = TableUtils.createStandardSortableTable(model);
 
   return new JScrollPane(table);
  }

 private Object getSelectedRow()
  {
   int rowIndex = TableUtils.getSelectedRow(table);
   return model.getRow(rowIndex);
  }
}

Table Sort Indicator

TODO

Large Table Support

TODO

Table Updater

TODO

Tips and Tricks

Minimize the amount of grey on the screen.

Um den anteil von Grau in den eigenen Views zu reduzieren kann man den Hintergrund des SrcollPane der Tabelle auf Weiß setzen.

JTable table = ...
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.getViewport().setOpaque(true);
scrollPane.getViewport().setBackground(table.getBackground());

Grey background

http://opensource.atlassian.com/confluence/spring/download/attachments/477/table_grey_bg.gif

White background

http://opensource.atlassian.com/confluence/spring/download/attachments/477/table_white_bg.gif


Go to top   Edit this page.   More info...   Attach file...

This page last changed on 10-Nov-2006 13:31:07 CET by PeterSchneider-Manzell.