com.levigo.util.swing.glazedlists
Class EventTableModel<E>

java.lang.Object
  extended by javax.swing.table.AbstractTableModel
      extended by com.levigo.util.swing.glazedlists.EventTableModel<E>
All Implemented Interfaces:
ListEventListener<E>, Serializable, EventListener, TableModel

public class EventTableModel<E>
extends AbstractTableModel
implements ListEventListener<E>

A TableModel that holds an EventList. Each element of the list corresponds to a row in the TableModel. The columns of the table are specified using a TableFormat.

The EventTableModel class is not thread-safe. Unless otherwise noted, all methods are only safe to be called from the event dispatch thread. To do this programmatically, use SwingUtilities.invokeAndWait(Runnable).

Author:
Jesse Wilson
See Also:
Glazed Lists Tutorial, SwingUtilities.invokeAndWait(Runnable), Bug 112, Bug 146, Bug 177, Serialized Form

Field Summary
protected  EventList<E> source
          the source of data for this TableModel, which may or may not be swingThreadSource
protected  TransformedList<E,E> swingThreadSource
          the proxy moves events to the Swing Event Dispatch thread
 
Fields inherited from class javax.swing.table.AbstractTableModel
listenerList
 
Constructor Summary
EventTableModel(EventList<E> source, String[] propertyNames, String[] columnLabels, boolean[] writable)
          Creates a new table that renders the specified list with an automatically generated TableFormat.
EventTableModel(EventList<E> source, TableFormat<? super E> tableFormat)
          Creates a new table model that extracts column data from the given source using the the given tableFormat.
 
Method Summary
protected  TransformedList<E,E> createSwingThreadProxyList(EventList<E> source)
          This method exists as a hook for subclasses that may have custom threading needs within their EventTableModels.
 void dispose()
          Releases the resources consumed by this EventTableModel so that it may eventually be garbage collected.
 Class getColumnClass(int columnIndex)
          Gets the class of elements in the specified column.
 int getColumnCount()
          Get the column count as specified by the table format.
 String getColumnName(int column)
          Fetch the name for the specified column.
 E getElementAt(int index)
          Retrieves the value at the specified location from the table.
protected  com.levigo.util.swing.glazedlists.MutableTableModelEvent getMutableTableModelEvent()
           
 int getRowCount()
          The number of rows equals the number of entries in the source event list.
 TableFormat<? super E> getTableFormat()
          Gets the Table Format.
 Object getValueAt(int row, int column)
          Retrieves the value at the specified location of the table.
protected  void handleListChange(ListEvent<E> listChanges)
          Default implementation for converting a ListEvent to TableModelEvents.
 boolean isCellEditable(int row, int column)
          Delegates the question of whether the cell is editable or not to the backing TableFormat if it is a WritableTableFormat.
 void listChanged(ListEvent<E> listChanges)
          For implementing the ListEventListener interface.
 void setTableFormat(TableFormat<E> tableFormat)
          Sets the TableFormat that will extract column data from each element.
 void setValueAt(Object editedValue, int row, int column)
          Attempts to update the object for the given row with the editedValue.
 
Methods inherited from class javax.swing.table.AbstractTableModel
addTableModelListener, findColumn, fireTableCellUpdated, fireTableChanged, fireTableDataChanged, fireTableRowsDeleted, fireTableRowsInserted, fireTableRowsUpdated, fireTableStructureChanged, getListeners, getTableModelListeners, removeTableModelListener
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

swingThreadSource

protected TransformedList<E,E> swingThreadSource
the proxy moves events to the Swing Event Dispatch thread


source

protected EventList<E> source
the source of data for this TableModel, which may or may not be swingThreadSource

Constructor Detail

EventTableModel

public EventTableModel(EventList<E> source,
                       TableFormat<? super E> tableFormat)
Creates a new table model that extracts column data from the given source using the the given tableFormat.

Parameters:
source - the EventList that provides the row objects
tableFormat - the object responsible for extracting column data from the row objects

EventTableModel

public EventTableModel(EventList<E> source,
                       String[] propertyNames,
                       String[] columnLabels,
                       boolean[] writable)
Creates a new table that renders the specified list with an automatically generated TableFormat. It uses JavaBeans and reflection to create a TableFormat as specified.

Note that the classes which will be obfuscated may not work with reflection. In this case, implement a TableFormat manually.

Parameters:
source - the EventList that provides the row objects
propertyNames - an array of property names in the JavaBeans format. For example, if your list contains Objects with the methods getFirstName(), setFirstName(String), getAge(), setAge(Integer), then this array should contain the two strings "firstName" and "age". This format is specified by the JavaBeans PropertyDescriptor.
columnLabels - the corresponding column names for the listed property names. For example, if your columns are "firstName" and "age", then your labels might be "First Name" and "Age".
writable - an array of booleans specifying which of the columns in your table are writable.
Method Detail

createSwingThreadProxyList

protected TransformedList<E,E> createSwingThreadProxyList(EventList<E> source)
This method exists as a hook for subclasses that may have custom threading needs within their EventTableModels. By default, this method will wrap the given source in a SwingThreadProxyList if it is not already a SwingThreadProxyList. Subclasses may replace this logic and return either a custom ThreadProxyEventList of their choosing, or return null or the source unchanged in order to indicate that NO ThreadProxyEventList is desired. In these cases it is expected that some external mechanism will ensure that threading is handled correctly.

Parameters:
source - the EventList that provides the row objects
Returns:
the source wrapped in some sort of ThreadProxyEventList if Thread-proxying is desired, or either null or the source unchanged to indicate that NO Thread-proxying is desired

getTableFormat

public TableFormat<? super E> getTableFormat()
Gets the Table Format.


setTableFormat

public void setTableFormat(TableFormat<E> tableFormat)
Sets the TableFormat that will extract column data from each element. This has some very important consequences. Any cell selections will be lost - this is due to the fact that the TableFormats may have different numbers of columns, and JTable has no event to specify columns changing without rows.


getElementAt

public E getElementAt(int index)
Retrieves the value at the specified location from the table.

This may be used by renderers to paint the cells of a row differently based on the entire value for that row.

See Also:
getValueAt(int,int)

listChanged

public void listChanged(ListEvent<E> listChanges)
For implementing the ListEventListener interface. This sends changes to the table which repaints the table cells. Because this class is backed by GlazedListsSwing.swingThreadProxyList(com.levigo.util.base.glazedlists.EventList), all natural calls to this method are guaranteed to occur on the Swing EDT.

Specified by:
listChanged in interface ListEventListener<E>

handleListChange

protected void handleListChange(ListEvent<E> listChanges)
Default implementation for converting a ListEvent to TableModelEvents. There will be one TableModelEvent per ListEvent block. Subclasses may choose to implement a different conversion.

Parameters:
listChanges - ListEvent to translate

getMutableTableModelEvent

protected final com.levigo.util.swing.glazedlists.MutableTableModelEvent getMutableTableModelEvent()
Returns:
reusable TableModelEvent for broadcasting changes

getColumnName

public String getColumnName(int column)
Fetch the name for the specified column.

Specified by:
getColumnName in interface TableModel
Overrides:
getColumnName in class AbstractTableModel

getRowCount

public int getRowCount()
The number of rows equals the number of entries in the source event list.

Specified by:
getRowCount in interface TableModel

getColumnCount

public int getColumnCount()
Get the column count as specified by the table format.

Specified by:
getColumnCount in interface TableModel

getColumnClass

public Class getColumnClass(int columnIndex)
Gets the class of elements in the specified column. This behaviour can be customized by implementing the AdvancedTableFormat interface.

Specified by:
getColumnClass in interface TableModel
Overrides:
getColumnClass in class AbstractTableModel

getValueAt

public Object getValueAt(int row,
                         int column)
Retrieves the value at the specified location of the table.

Specified by:
getValueAt in interface TableModel

isCellEditable

public boolean isCellEditable(int row,
                              int column)
Delegates the question of whether the cell is editable or not to the backing TableFormat if it is a WritableTableFormat. Otherwise, the column is assumed to be uneditable.

Specified by:
isCellEditable in interface TableModel
Overrides:
isCellEditable in class AbstractTableModel

setValueAt

public void setValueAt(Object editedValue,
                       int row,
                       int column)
Attempts to update the object for the given row with the editedValue. This requires the backing TableFormat be a WritableTableFormat. WritableTableFormat.setColumnValue(E, java.lang.Object, int) is expected to contain the logic for updating the object at the given row with the editedValue which was in the given column.

Specified by:
setValueAt in interface TableModel
Overrides:
setValueAt in class AbstractTableModel

dispose

public void dispose()
Releases the resources consumed by this EventTableModel so that it may eventually be garbage collected.

An EventTableModel will be garbage collected without a call to dispose(), but not before its source EventList is garbage collected. By calling dispose(), you allow the EventTableModel to be garbage collected before its source EventList. This is necessary for situations where an EventTableModel is short-lived but its source EventList is long-lived.

Warning: It is an error to call any method on an EventTableModel after it has been disposed. As such, this EventTableModel should be detached from its corresponding Component before it is disposed.



Copyright © 1995-2020 levigo holding gmbh. All Rights Reserved.