import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.List;
import javax.swing.*;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.*;
/**
* 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.
* <p>
* TableSorter registers itself as a listener to the underlying model,
* just as the JTable itself would. Events revieved 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.
* <p>
* 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:
* <ul>
* <li>
* 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).
* <li>
* 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 a different order: {NOT_SORTED, DESCENDING, ASCENDING}.
* <li>
* 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.
* </ul>
*
* @author Philip Milne
* @author Brendon McLean
* @author Dan van Enckevort
* @author Parwinder Sekhon
*
*/
/*
* This is a, long overdue, rewrite of a class of the same name that
* first appeared in the swing table demos in 1997. This version was
* last updated on: 25:2:2004
*/
public class TableSorter extends AbstractTableModel {
protected TableModel tableModel;
public static final int DESCENDING = -1;
public static final int NOT_SORTED = 0;
public static final int ASCENDING = 1;
private static Directive EMPTY_DIRECTIVE = new Directive(-1, NOT_SORTED);
public static final Comparator COMPARABLE_COMAPRATOR = new Comparator() {
public int compare(Object o1, Object o2) {
return ((Comparable) o1).compareTo(o2);
}
};
public static final Comparator LEXICAL_COMPARATOR = new Comparator() {
public int compare(Object o1, Object o2) {
return o1.toString().compareTo(o2.toString());
}
};
private Row[] viewToModel;
private int[] modelToView;
private JTableHeader tableHeader;
private MouseListener mouseListener;
private TableModelListener tableModelListener;
private Map columnComparators = new HashMap();
private List sortingColumns = new ArrayList();
public TableSorter() {
this.mouseListener = new MouseHandler();
this.tableModelListener = new TableModelHandler();
}
public TableSorter(TableModel tableModel) {
this();
setTableModel(tableModel);
}
public TableSorter(TableModel tableModel, JTableHeader tableHeader) {
this();
setTableHeader(tableHeader);
setTableModel(tableModel);
}
private void clearSortingState() {
viewToModel = null;
modelToView = null;
}
public TableModel getTableModel() {
return tableModel;
}
public void setTableModel(TableModel tableModel) {
if (this.tableModel != null) {
this.tableModel.removeTableModelListener(tableModelListener);
}
this.tableModel = tableModel;
if (this.tableModel != null) {
this.tableModel.addTableModelListener(tableModelListener);
}
clearSortingState();
fireTableStructureChanged();
}
public JTableHeader getTableHeader() {
return tableHeader;
}
public void setTableHeader(JTableHeader tableHeader) {
if (this.tableHeader != null) {
this.tableHeader.removeMouseListener(mouseListener);
TableCellRenderer defaultRenderer = this.tableHeader.getDefaultRenderer();
if (defaultRenderer instanceof SortableHeaderRenderer) {
this.tableHeader.setDefaultRenderer(((SortableHeaderRenderer) defaultRenderer).tableCellRenderer);
}
}
this.tableHeader = tableHeader;
if (this.tableHeader != null) {
this.tableHeader.addMouseListener(mouseListener);
this.tableHeader.setDefaultRenderer(
new SortableHeaderRenderer(this.tableHeader.getDefaultRenderer()));
}
}
public boolean isSorting() {
return sortingColumns.size() != 0;
}
private Directive getDirective(int column) {
for (int i = 0; i < sortingColumns.size(); i++) {
Directive directive = (Directive)sortingColumns.get(i);
if (directive.column == column) {
return directive;
}
}
return EMPTY_DIRECTIVE;
}
public int getSortingStatus(int column) {
return getDirective(column).direction;
}
private void sortingStatusChanged() {
clearSortingState();
fireTableDataChanged();
tableHeader.repaint();
}
public void setSortingStatus(int column, int status) {
Directive directive = getDirective(column);
if (directive != EMPTY_DIRECTIVE) {
sortingColumns.remove(directive);
}
if (status != NOT_SORTED) {
sortingColumns.add(new Directive(column, status));
}
sortingStatusChanged();
}
protected Icon getHeaderRendererIcon(int column, int size) {
Directive directive = getDirective(column);
if (directive == EMPTY_DIRECTIVE) {
return null;
}
return new Arrow(directive.direction == DESCENDING, size, sortingColumns.indexOf(directive));
}
private void cancelSorting() {
sortingColumns.clear();
sortingStatusChanged();
}
public void setColumnComparator(Class type, Comparator comparator) {
if (comparator == null) {
columnComparators.remove(type);
} else {
columnComparators.put(type, comparator);
}
}
protected Comparator getComparator(int column) {
Class columnType = tableModel.getColumnClass(column);
Comparator comparator = (Comparator) columnComparators.get(columnType);
if (comparator != null) {
return comparator;
}
if (Comparable.class.isAssignableFrom(columnType)) {
return COMPARABLE_COMAPRATOR;
}
return LEXICAL_COMPARATOR;
}
private Row[] getViewToModel() {
if (viewToModel == null) {
int tableModelRowCount = tableModel.getRowCount();
viewToModel = new Row[tableModelRowCount];
for (int row = 0; row < tableModelRowCount; row++) {
viewToModel[row] = new Row(row);
}
if (isSorting()) {
Arrays.sort(viewToModel);
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Java2核心技术2II.rar_ERP_ERP系统_java2 核心技术_java2核心技术 (182个子文件)
BasicDnD .java.bak 6KB
TreeEditTest.java.bak 5KB
PlanetTable.java.bak 2KB
ResultSetTableFrame.class 5KB
ClassTreeFrame.class 4KB
ObjectTreeModel.class 4KB
TreeEditFrame.class 3KB
ResultSetTableFrame$1.class 3KB
Variable.class 2KB
PlanetTableFrame.class 2KB
TreeEditFrame$1.class 2KB
SimpleTreeFrame.class 2KB
CachingResultSetTableModel.class 2KB
TreeEditFrame$2.class 2KB
ClassTreeFrame$1.class 1KB
ClassNameTreeCellRenderer.class 1KB
ObjectInspectorFrame.class 1KB
TreeEditFrame$3.class 1KB
ResultSetTableModel.class 1KB
ScrollingResultSetTableModel.class 1011B
ResultSetTableFrame$2.class 865B
ObjectInspectorTest.class 590B
ClassBrowserTest.class 582B
ResultSetTable.class 574B
TreeEditTest.class 562B
PlanetTable.class 562B
SimpleTree.class 558B
ClassTree.class 554B
unnamed package.dep2 5KB
unnamed package.dep2 4KB
unnamed package.dep2 3KB
unnamed package.dep2 2KB
unnamed package.dep2 750B
Frame1.html 384B
treeDemoFiles.jar 3KB
TableSorter.java 17KB
TreeIconDemo2.java 10KB
PopupMenuDemo.java 8KB
TreeIconDemo.java 8KB
TreeDemo.java 8KB
TreeDemo.java 8KB
TableRenderDemo.java 8KB
TableToolTipsDemo.java 8KB
GlassPaneDemo.java 7KB
BasicDnD .java 6KB
ResultSetTable.java 6KB
TableSorterDemo.java 6KB
TableDialogEditDemo.java 5KB
TableFTFEditDemo.java 5KB
GenealogyExample.java 5KB
TableDemo.java 5KB
ObjectInspectorTest.java 5KB
TreeEditTest.java 5KB
DynamicTree.java 4KB
ExtendedDnDDemo.java 4KB
ClassTree.java 4KB
GenealogyModel.java 4KB
ClassBrowserTest.java 4KB
DynamicTreeDemo.java 4KB
ProgressBarDemo.java 4KB
SimpleTree.java 2KB
TableMap.java 2KB
PlanetTable.java 2KB
GenealogyTree.java 1KB
PlanetTable.java~10~ 2KB
SimpleTree.java~10~ 2KB
PlanetTable.java~11~ 2KB
SimpleTree.java~11~ 2KB
PlanetTable.java~12~ 2KB
SimpleTree.java~12~ 2KB
PlanetTable.java~13~ 2KB
SimpleTree.java~13~ 2KB
ClassTree.java~14~ 4KB
PlanetTable.java~14~ 2KB
SimpleTree.java~14~ 2KB
TreeEditTest.java~15~ 4KB
ClassTree.java~15~ 4KB
PlanetTable.java~15~ 2KB
SimpleTree.java~15~ 2KB
TreeEditTest.java~16~ 4KB
ClassTree.java~16~ 4KB
ClassBrowserTest.java~16~ 4KB
SimpleTree.java~16~ 2KB
PlanetTable.java~16~ 2KB
TreeEditTest.java~17~ 4KB
ClassTree.java~17~ 4KB
ClassBrowserTest.java~17~ 4KB
SimpleTree.java~17~ 2KB
TreeEditTest.java~18~ 4KB
ClassTree.java~18~ 4KB
ClassBrowserTest.java~18~ 4KB
SimpleTree.java~18~ 2KB
TreeEditTest.java~19~ 4KB
ClassTree.java~19~ 4KB
ClassBrowserTest.java~19~ 4KB
TreeEditTest.java~20~ 4KB
ClassTree.java~20~ 4KB
ClassBrowserTest.java~20~ 4KB
TreeEditTest.java~21~ 4KB
ClassTree.java~21~ 4KB
共 182 条
- 1
- 2
资源评论
weixin_42653672
- 粉丝: 93
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功