Class TableSorter
- java.lang.Object
-
- javax.swing.table.AbstractTableModel
-
- gov.nih.mipav.model.structures.TableSorter
-
- All Implemented Interfaces:
java.io.Serializable
,javax.swing.table.TableModel
public class TableSorter extends javax.swing.table.AbstractTableModel
TableSorter is a decorator for TableModels; adding sorting functionality to a supplied TableModel. TableSorter does not store or copy the data in its TableModel; instead it maintains a map from the row indexes of the view to the row indexes of the model. As requests are made of the sorter (like getValueAt(row, col)) they are passed to the underlying model after the row numbers have been translated via the internal mapping array. This way, the TableSorter appears to hold another copy of the table with the rows in a different order.TableSorter registers itself as a listener to the underlying model, just as the JTable itself would. Events recieved from the model are examined, sometimes manipulated (typically widened), and then passed on to the TableSorter's listeners (typically the JTable). If a change to the model has invalidated the order of TableSorter's rows, a note of this is made and the sorter will resort the rows the next time a value is requested.
When the tableHeader property is set, either by using the setTableHeader() method or the two argument constructor, the table header may be used as a complete UI for TableSorter. The default renderer of the tableHeader is decorated with a renderer that indicates the sorting status of each column. In addition, a mouse listener is installed with the following behavior:
- Mouse-click: Clears the sorting status of all other columns and advances the sorting status of that column through three values: {NOT_SORTED, ASCENDING, DESCENDING} (then back to NOT_SORTED again).
- SHIFT-mouse-click: Clears the sorting status of all other columns and cycles the sorting status of the column through the same three values, in the opposite order: {NOT_SORTED, DESCENDING, ASCENDING}.
- CONTROL-mouse-click and CONTROL-SHIFT-mouse-click: as above except that the changes to the column do not cancel the statuses of columns that are already sorting - giving a way to initiate a compound sort.
This is a long overdue rewrite of a class of the same name that first appeared in the swing table demos in 1997.
Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of Sun Microsystems nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- Version:
- 2.0 02/27/04
- Author:
- Philip Milne, Brendon McLean, Dan van Enckevort, Parwinder Sekhon
- See Also:
- Serialized Form
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static class
TableSorter.Arrow
DOCUMENT ME!private static class
TableSorter.Directive
DOCUMENT ME!private class
TableSorter.MouseHandler
DOCUMENT ME!private class
TableSorter.Row
Helper classes.private class
TableSorter.SortableHeaderRenderer
DOCUMENT ME!private class
TableSorter.TableModelHandler
DOCUMENT ME!
-
Field Summary
Fields Modifier and Type Field Description static int
ASCENDING
DOCUMENT ME!private java.util.Map<java.lang.Class,java.util.Comparator>
columnComparators
static java.util.Comparator<java.lang.Object>
COMPARABLE_COMPARATOR
DOCUMENT ME!static int
DESCENDING
DOCUMENT ME!private static TableSorter.Directive
EMPTY_DIRECTIVE
DOCUMENT ME!static java.util.Comparator<java.lang.Object>
LEXICAL_COMPARATOR
DOCUMENT ME!static java.util.Comparator<java.lang.Object>
LEXICAL_NUMS_COMPARATOR
This is comparator such that it also determines if the string has numbers leading the string....if it does have numbers, it sorts using the numbers alsoprivate int[]
modelToView
DOCUMENT ME!private java.awt.event.MouseListener
mouseListener
DOCUMENT ME!static int
NOT_SORTED
DOCUMENT ME!private static long
serialVersionUID
Use serialVersionUID for interoperability.private java.util.List<TableSorter.Directive>
sortingColumns
DOCUMENT ME!private javax.swing.table.JTableHeader
tableHeader
DOCUMENT ME!protected javax.swing.table.TableModel
tableModel
DOCUMENT ME!private javax.swing.event.TableModelListener
tableModelListener
DOCUMENT ME!private TableSorter.Row[]
viewToModel
DOCUMENT ME!
-
Constructor Summary
Constructors Constructor Description TableSorter()
Creates a new TableSorter object.TableSorter(javax.swing.table.TableModel tableModel)
Creates a new TableSorter object.TableSorter(javax.swing.table.TableModel tableModel, javax.swing.table.JTableHeader tableHeader)
Creates a new TableSorter object.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description private void
cancelSorting()
DOCUMENT ME!private void
clearSortingState()
DOCUMENT ME!java.lang.Class
getColumnClass(int column)
DOCUMENT ME!int
getColumnCount()
DOCUMENT ME!java.lang.String
getColumnName(int column)
DOCUMENT ME!protected java.util.Comparator<java.lang.Object>
getComparator(int column)
Gets an appropriate comparator for sorting the particular columnprivate TableSorter.Directive
getDirective(int column)
DOCUMENT ME!protected javax.swing.Icon
getHeaderRendererIcon(int column, int size)
DOCUMENT ME!private int[]
getModelToView()
DOCUMENT ME!int
getRowCount()
TableModel interface methods.int
getSortingStatus(int column)
DOCUMENT ME!javax.swing.table.JTableHeader
getTableHeader()
DOCUMENT ME!javax.swing.table.TableModel
getTableModel()
DOCUMENT ME!java.lang.Object
getValueAt(int row, int column)
DOCUMENT ME!private TableSorter.Row[]
getViewToModel()
DOCUMENT ME!boolean
isCellEditable(int row, int column)
DOCUMENT ME!boolean
isSorting()
DOCUMENT ME!int
modelIndex(int viewIndex)
DOCUMENT ME!void
setColumnComparator(java.lang.Class type, java.util.Comparator comparator)
DOCUMENT ME!void
setSortingStatus(int column, int status)
DOCUMENT ME!void
setTableHeader(javax.swing.table.JTableHeader tableHeader)
DOCUMENT ME!void
setTableModel(javax.swing.table.TableModel tableModel)
DOCUMENT ME!void
setValueAt(java.lang.Object aValue, int row, int column)
DOCUMENT ME!private void
sortingStatusChanged()
DOCUMENT ME!-
Methods inherited from class javax.swing.table.AbstractTableModel
addTableModelListener, findColumn, fireTableCellUpdated, fireTableChanged, fireTableDataChanged, fireTableRowsDeleted, fireTableRowsInserted, fireTableRowsUpdated, fireTableStructureChanged, getListeners, getTableModelListeners, removeTableModelListener
-
-
-
-
Field Detail
-
serialVersionUID
private static final long serialVersionUID
Use serialVersionUID for interoperability.- See Also:
- Constant Field Values
-
DESCENDING
public static final int DESCENDING
DOCUMENT ME!- See Also:
- Constant Field Values
-
NOT_SORTED
public static final int NOT_SORTED
DOCUMENT ME!- See Also:
- Constant Field Values
-
ASCENDING
public static final int ASCENDING
DOCUMENT ME!- See Also:
- Constant Field Values
-
EMPTY_DIRECTIVE
private static TableSorter.Directive EMPTY_DIRECTIVE
DOCUMENT ME!
-
COMPARABLE_COMPARATOR
public static final java.util.Comparator<java.lang.Object> COMPARABLE_COMPARATOR
DOCUMENT ME!
-
LEXICAL_COMPARATOR
public static final java.util.Comparator<java.lang.Object> LEXICAL_COMPARATOR
DOCUMENT ME!
-
LEXICAL_NUMS_COMPARATOR
public static final java.util.Comparator<java.lang.Object> LEXICAL_NUMS_COMPARATOR
This is comparator such that it also determines if the string has numbers leading the string....if it does have numbers, it sorts using the numbers also
-
tableModel
protected javax.swing.table.TableModel tableModel
DOCUMENT ME!
-
columnComparators
private final java.util.Map<java.lang.Class,java.util.Comparator> columnComparators
-
modelToView
private int[] modelToView
DOCUMENT ME!
-
mouseListener
private final java.awt.event.MouseListener mouseListener
DOCUMENT ME!
-
sortingColumns
private final java.util.List<TableSorter.Directive> sortingColumns
DOCUMENT ME!
-
tableHeader
private javax.swing.table.JTableHeader tableHeader
DOCUMENT ME!
-
tableModelListener
private final javax.swing.event.TableModelListener tableModelListener
DOCUMENT ME!
-
viewToModel
private TableSorter.Row[] viewToModel
DOCUMENT ME!
-
-
Constructor Detail
-
TableSorter
public TableSorter()
Creates a new TableSorter object.
-
TableSorter
public TableSorter(javax.swing.table.TableModel tableModel)
Creates a new TableSorter object.- Parameters:
tableModel
- DOCUMENT ME!
-
TableSorter
public TableSorter(javax.swing.table.TableModel tableModel, javax.swing.table.JTableHeader tableHeader)
Creates a new TableSorter object.- Parameters:
tableModel
- DOCUMENT ME!tableHeader
- DOCUMENT ME!
-
-
Method Detail
-
getColumnClass
public java.lang.Class getColumnClass(int column)
DOCUMENT ME!- Specified by:
getColumnClass
in interfacejavax.swing.table.TableModel
- Overrides:
getColumnClass
in classjavax.swing.table.AbstractTableModel
- Parameters:
column
- DOCUMENT ME!- Returns:
- DOCUMENT ME!
-
getColumnCount
public int getColumnCount()
DOCUMENT ME!- Returns:
- DOCUMENT ME!
-
getColumnName
public java.lang.String getColumnName(int column)
DOCUMENT ME!- Specified by:
getColumnName
in interfacejavax.swing.table.TableModel
- Overrides:
getColumnName
in classjavax.swing.table.AbstractTableModel
- Parameters:
column
- DOCUMENT ME!- Returns:
- DOCUMENT ME!
-
getRowCount
public int getRowCount()
TableModel interface methods.- Returns:
- DOCUMENT ME!
-
getSortingStatus
public int getSortingStatus(int column)
DOCUMENT ME!- Parameters:
column
- DOCUMENT ME!- Returns:
- DOCUMENT ME!
-
getTableHeader
public javax.swing.table.JTableHeader getTableHeader()
DOCUMENT ME!- Returns:
- DOCUMENT ME!
-
getTableModel
public javax.swing.table.TableModel getTableModel()
DOCUMENT ME!- Returns:
- DOCUMENT ME!
-
getValueAt
public java.lang.Object getValueAt(int row, int column)
DOCUMENT ME!- Parameters:
row
- DOCUMENT ME!column
- DOCUMENT ME!- Returns:
- DOCUMENT ME!
-
isCellEditable
public boolean isCellEditable(int row, int column)
DOCUMENT ME!- Specified by:
isCellEditable
in interfacejavax.swing.table.TableModel
- Overrides:
isCellEditable
in classjavax.swing.table.AbstractTableModel
- Parameters:
row
- DOCUMENT ME!column
- DOCUMENT ME!- Returns:
- DOCUMENT ME!
-
isSorting
public boolean isSorting()
DOCUMENT ME!- Returns:
- DOCUMENT ME!
-
modelIndex
public int modelIndex(int viewIndex)
DOCUMENT ME!- Parameters:
viewIndex
- DOCUMENT ME!- Returns:
- DOCUMENT ME!
-
setColumnComparator
public void setColumnComparator(java.lang.Class type, java.util.Comparator comparator)
DOCUMENT ME!- Parameters:
type
- DOCUMENT ME!comparator
- DOCUMENT ME!
-
setSortingStatus
public void setSortingStatus(int column, int status)
DOCUMENT ME!- Parameters:
column
- DOCUMENT ME!status
- DOCUMENT ME!
-
setTableHeader
public void setTableHeader(javax.swing.table.JTableHeader tableHeader)
DOCUMENT ME!- Parameters:
tableHeader
- DOCUMENT ME!
-
setTableModel
public void setTableModel(javax.swing.table.TableModel tableModel)
DOCUMENT ME!- Parameters:
tableModel
- DOCUMENT ME!
-
setValueAt
public void setValueAt(java.lang.Object aValue, int row, int column)
DOCUMENT ME!- Specified by:
setValueAt
in interfacejavax.swing.table.TableModel
- Overrides:
setValueAt
in classjavax.swing.table.AbstractTableModel
- Parameters:
aValue
- DOCUMENT ME!row
- DOCUMENT ME!column
- DOCUMENT ME!
-
getComparator
protected java.util.Comparator<java.lang.Object> getComparator(int column)
Gets an appropriate comparator for sorting the particular column- Parameters:
column
- The column to sort by fromtableModel
- Returns:
- A comparator for a given column
-
getHeaderRendererIcon
protected javax.swing.Icon getHeaderRendererIcon(int column, int size)
DOCUMENT ME!- Parameters:
column
- DOCUMENT ME!size
- DOCUMENT ME!- Returns:
- DOCUMENT ME!
-
cancelSorting
private void cancelSorting()
DOCUMENT ME!
-
clearSortingState
private void clearSortingState()
DOCUMENT ME!
-
getDirective
private TableSorter.Directive getDirective(int column)
DOCUMENT ME!- Parameters:
column
- DOCUMENT ME!- Returns:
- DOCUMENT ME!
-
getModelToView
private int[] getModelToView()
DOCUMENT ME!- Returns:
- DOCUMENT ME!
-
getViewToModel
private TableSorter.Row[] getViewToModel()
DOCUMENT ME!- Returns:
- DOCUMENT ME!
-
sortingStatusChanged
private void sortingStatusChanged()
DOCUMENT ME!
-
-