RCPUnterstützungVonTabellenTable of ContentsSpring RCP stellt Hilfs- und Standardklassen für die Arbeit mit Tabellen bereit. Table ModelsWenn 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;
}
};
BeanTableModelDas 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 ListTableModelMit einem ListTableModel kann man ein TableModel aus einer Liste von Objekten, Listen oder Arrays erzeugen.Dies funktioniert folgendermassen:
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:
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:
Table RenderingEinige Standard Cellrenderer sind installiert, wenn man eine Tabelle mit der TableUtils Klasse erzeugt.
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 TablesTODO Sortable TablesMan 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 IndicatorTODOLarge Table SupportTODOTable UpdaterTODOTips and TricksMinimize 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. |