java.lang.Object java.awt.Component java.awt.Container javax.swing.JComponent javax.swing.JTable
public class JTable
JTable
用来显示和编辑常规二维单元表。有关面向任务的文档和使用 JTable
的示例,请参阅 The Java Tutorial 中的 How to Use Tables 一节。
JTable
有很多用来自定义其呈现和编辑的工具,同时提供了这些功能的默认设置,从而可以轻松地设置简单表。例如,要设置一个 10 行 10 列的表:
TableModel dataModel = new AbstractTableModel() { public int getColumnCount() { return 10; } public int getRowCount() { return 10;} public Object getValueAt(int row, int col) { return new Integer(row*col); } }; JTable table = new JTable(dataModel); JScrollPane scrollpane = new JScrollPane(table);
注意,如果要在单独的视图中(在 JScrollPane
外)使用 JTable
并显示表标题,则可以使用 getTableHeader()
获取并单独显示它。
要启用行的排序和过滤,请使用 RowSorter
。可以通过以下两种方式之一设置一个行排序器。
RowSorter
。例如:table.setRowSorter(new TableRowSorter(model))
。 autoCreateRowSorter
属性设置为 true
,从而 JTable
可用于创建 RowSorter
。例如:setAutoCreateRowSorter(true)
。 设计使用 JTable
的应用程序时,务必要注意用来表示表数据的数据结构。DefaultTableModel
是一个模型实现,它使用一个 Vector
来存储所有单元格的值,该 Vector
由包含多个 Object
的 Vector
组成。除了将数据从应用程序复制到 DefaultTableModel
中之外,还可以用 TableModel
接口的方法来包装数据,这样可将数据直接传递到 JTable
,如上例所示。这通常可以提高应用程序的效率,因为模型可以自由选择最适合数据的内部表示形式。在决定使用 AbstractTableModel
还是使用 DefaultTableModel
方面有一个好的实践经验,即在创建子类时使用 AbstractTableModel
作为基类,在不需要创建子类时则使用 DefaultTableModel
。
源分布演示部分中的 "TableExample" 目录给出了许多 JTable
用法的完整示例,包括如何使用 JTable
来提供一个可编辑的数据视图(数据取自数据库),以及如何修改显示的列以使用指定的渲染器和编辑器。
JTable
使用专有的整数来引用它所显示的模型的行和列。JTable
采用表格的单元格范围,并在绘制时使用 getValueAt(int, int)
从模型中获取值。务必记住各种 JTable
方法所返回的列和行索引是就 JTable
(视图)而言的,不一定是模型所使用的那些索引。
默认情况下,在 JTable
中对列进行重新安排,这样在视图中列的出现顺序与模型中列的顺序不同。但这根本不影响模型的实现:当列重新排列时,JTable
在内部保持列的新顺序,并在查询模型前转换其列索引。
因此编写 TableModel
时,不必侦听列的重排事件,因为不管视图怎样,模型都将在其自己的坐标系统被查询。在示例部分中有一个排序算法的演示,此演示正是使用了此技术在另一个坐标系统中进行排序,其中更改了行顺序,没有更改列顺序。
类似地,使用 RowSorter
提供的排序和过滤功能时,底层 TableModel
不需要知道怎样进行排序,RowSorter
将处理它。对底层 TableModel
使用 JTable
的基于行的方法时,必须进行坐标转换。所有基于 JTable
行的方法都是就 RowSorter
而言的,不一定与底层 TableModel
的方法相同。例如,选择始终是就 JTable
而言的,因此使用 RowSorter
时,需要使用 convertRowIndexToView
或 convertRowIndexToModel
进行转换。以下代码显示了如何将 JTable
的坐标转换为底层模型的坐标:
int[] selection = table.getSelectedRows(); for (int i = 0; i < selection.length; i++) { selection[i] = table.convertRowIndexToModel(selection[i]); } // selection is now in terms of the underlying TableModel
默认情况下,如果启用排序,那么排序时 JTable
将保留基于模型的选择和可变行高度。例如,如果当前选择行 0(就底层模型而言),那么排序之后将选择行 0(就底层模型而言)。选择有可能看起来被更改了,但就底层模型而言它仍然保持不变。模型索引不再可见或者被移除时除外。例如,如果行 0 被过滤掉了,那么选择在排序后将为空。
J2SE 5 在 JTable
中添加了一些方法,为某些普通打印需求提供方便的访问。print()
是一个简单的新方法,它允许快速简单地向应用程序添加打印支持。此外,新的 getPrintable(javax.swing.JTable.PrintMode, java.text.MessageFormat, java.text.MessageFormat)
方法可用于更高级的打印需求。
对于所有的 JComponent
类,可以使用 InputMap
和 ActionMap
将 Action
对象与 KeyStroke
进行关联,并在指定的条件下执行动作。
警告:Swing 不是线程安全的。有关更多信息,请参阅 Swing's Threading Policy。
警告:此类的序列化对象与以后的 Swing 版本不兼容。当前序列化支持适用于短期存储,或适用于在运行相同 Swing 版本的应用程序之间进行 RMI(Remote Method Invocation,远程方法调用)。从 1.4 版本开始,已在 java.beans
包中添加了支持所有 JavaBeansTM 长期存储的功能。请参见 XMLEncoder
。
DefaultTableModel
,
TableRowSorter
嵌套类摘要 | |
---|---|
protected class |
JTable.AccessibleJTable 此类实现对 JTable 类的可访问性支持。 |
static class |
JTable.DropLocation TransferHandler.DropLocation 的一个子类,表示 JTable 的放置位置 (drop location)。 |
static class |
JTable.PrintMode 用于打印 JTable 的打印模式。 |
从类 javax.swing.JComponent 继承的嵌套类/接口 |
---|
JComponent.AccessibleJComponent |
从类 java.awt.Container 继承的嵌套类/接口 |
---|
Container.AccessibleAWTContainer |
从类 java.awt.Component 继承的嵌套类/接口 |
---|
Component.AccessibleAWTComponent, Component.BaselineResizeBehavior, Component.BltBufferStrategy, Component.FlipBufferStrategy |
字段摘要 | |
---|---|
static int |
AUTO_RESIZE_ALL_COLUMNS 在所有的调整大小操作中,按比例调整所有的列。 |
static int |
AUTO_RESIZE_LAST_COLUMN 在所有的调整大小操作中,只对最后一列进行调整。 |
static int |
AUTO_RESIZE_NEXT_COLUMN 在 UI 中调整了一个列时,对其下一列进行相反方向的调整。 |
static int |
AUTO_RESIZE_OFF 不自动调整列的宽度;使用滚动条。 |
static int |
AUTO_RESIZE_SUBSEQUENT_COLUMNS 在 UI 调整中,更改后续列以保持总宽度不变;此为默认行为。 |
protected boolean |
autoCreateColumnsFromModel 如果为 true,则表对 TableModel 进行查询以构建默认列集。 |
protected int |
autoResizeMode 确定表是否自动调整列的宽度以占用表的整个宽度,以及如何进行调整。 |
protected TableCellEditor |
cellEditor 活动单元格编辑器对象,它重写当前单元格占用的屏幕空间,并允许用户更改其内容。 |
protected boolean |
cellSelectionEnabled 从 Java 2 平台 v1.3 开始已过时。 |
protected TableColumnModel |
columnModel 表的 TableColumnModel 。 |
protected TableModel |
dataModel 表的 TableModel 。 |
protected Hashtable |
defaultEditorsByColumnClass 一个由对象组成的表,它显示并编辑单元格的内容,通过在 TableModel 接口的 getColumnClass 中所声明的类建立索引。 |
protected Hashtable |
defaultRenderersByColumnClass 一个由对象组成的表,它显示单元格的内容,通过在 TableModel 接口的 getColumnClass 中所声明的类建立索引。 |
protected int |
editingColumn 标识所编辑的单元格的列。 |
protected int |
editingRow 标识所编辑的单元格的行。 |
protected Component |
editorComp 在编辑时处理编辑的 Component 。 |
protected Color |
gridColor 网格的颜色。 |
protected Dimension |
preferredViewportSize Scrollable 接口使用它来确定初始的可见区域。 |
protected int |
rowHeight 表中每一行的高度,以像素为单位。 |
protected int |
rowMargin 每行中单元格之间间距的高度,以像素为单位。 |
protected boolean |
rowSelectionAllowed 如果行选择在此表中是允许的,则返回 true。 |
protected Color |
selectionBackground 已选定单元格的背景色。 |
protected Color |
selectionForeground 已选定单元格的前景色。 |
protected ListSelectionModel |
selectionModel 表的 ListSelectionModel ,用来追踪行选择。 |
protected boolean |
showHorizontalLines 如果 showHorizontalLines 为 true,则表在单元格之间绘制水平行。 |
protected boolean |
showVerticalLines 如果 showVerticalLines 为 true,则表在单元格之间绘制垂直行。 |
protected JTableHeader |
tableHeader 表所使用的 TableHeader 。 |
从类 javax.swing.JComponent 继承的字段 |
---|
accessibleContext, listenerList, TOOL_TIP_TEXT_KEY, ui, UNDEFINED_CONDITION, WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, WHEN_FOCUSED, WHEN_IN_FOCUSED_WINDOW |
从类 java.awt.Component 继承的字段 |
---|
BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT |
从接口 java.awt.image.ImageObserver 继承的字段 |
---|
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH |
构造方法摘要 | |
---|---|
JTable() 构造一个默认的 JTable ,使用默认的数据模型、默认的列模型和默认的选择模型对其进行初始化。 |
|
JTable(int numRows, int numColumns) 使用 DefaultTableModel 构造具有 numRows 行和 numColumns 列个空单元格的 JTable 。 |
|
JTable(Object[][] rowData, Object[] columnNames) 构造一个 JTable 来显示二维数组 rowData 中的值,其列名称为 columnNames 。 |
|
JTable(TableModel dm) 构造一个 JTable ,使用数据模型 dm 、默认的列模型和默认的选择模型对其进行初始化。 |
|
JTable(TableModel dm, TableColumnModel cm) 构造一个 JTable ,使用数据模型 dm 、列模型 cm 和默认的选择模型对其进行初始化。 |
|
JTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm) 构造一个 JTable ,使用数据模型 dm 、列模型 cm 和选择模型 sm 对其进行初始化。 |
|
JTable(Vector rowData, Vector columnNames) 构造一个 JTable 来显示 Vector 所组成的 Vector rowData 中的值,其列名称为 columnNames 。 |
方法摘要 | |
---|---|
void |
addColumn(TableColumn aColumn) 将 aColumn 追加到此 JTable 的列模型所保持的列数组的尾部。 |
void |
addColumnSelectionInterval(int index0, int index1) 将从 index0 到 index1 之间(包含两端)的列添加到当前选择中。 |
void |
addNotify() 调用 configureEnclosingScrollPane 方法。 |
void |
addRowSelectionInterval(int index0, int index1) 将从 index0 到 index1 之间(包含两端)的行添加到当前选择中。 |
void |
changeSelection(int rowIndex, int columnIndex, boolean toggle, boolean extend) 根据 toggle 和 extend 这两个标志的状态,更新表的选择模型。 |
void |
clearSelection() 取消选中所有已选定的行和列。 |
void |
columnAdded(TableColumnModelEvent e) 将列添加到表的列模型时调用。 |
int |
columnAtPoint(Point point) 返回 point 所在的列索引;如果结果不在 [0, getColumnCount() -1] 范围内,则返回 -1。 |
void |
columnMarginChanged(ChangeEvent e) 当列由于间距的更改而被移动时调用。 |
void |
columnMoved(TableColumnModelEvent e) 重新定位列时调用。 |
void |
columnRemoved(TableColumnModelEvent e) 从表的列模型中移除列时调用。 |
void |
columnSelectionChanged(ListSelectionEvent e) TableColumnModel 的选择模型更改时调用。 |
protected void |
configureEnclosingScrollPane() 如果此 JTable 是一个封闭 JScrollPane 的 viewportView (通常情况如此),那么可通过安装表的 tableHeader 作为滚动窗格的 columnHeaderView 来配置此 ScrollPane 。 |
int |
convertColumnIndexToModel(int viewColumnIndex) 将视图中位于 viewColumnIndex 的列索引映射到表模型中的列索引。 |
int |
convertColumnIndexToView(int modelColumnIndex) 将表模型中位于 modelColumnIndex 的列索引映射到视图中的列索引。 |
int |
convertRowIndexToModel(int viewRowIndex) 将基于视图的行索引映射到底层 TableModel 。 |
int |
convertRowIndexToView(int modelRowIndex) 将基于 TableModel 的行索引映射到该视图。 |
protected TableColumnModel |
createDefaultColumnModel() 返回默认的列模型对象,它是一个 DefaultTableColumnModel 。 |
void |
createDefaultColumnsFromModel() 使用 TableModel 接口中定义的 getColumnCount 方法根据数据模型创建默认的表列。 |
protected TableModel |
createDefaultDataModel() 返回默认的表模型对象,它是一个 DefaultTableModel 。 |
protected void |
createDefaultEditors() 为 object、number 和 boolean 值创建默认的单元格编辑器。 |
protected void |
createDefaultRenderers() 为 object、number、double、date、boolean 和 icon 创建默认的单元格渲染器。 |
protected ListSelectionModel |
createDefaultSelectionModel() 返回默认的选择模型对象,它是一个 DefaultListSelectionModel 。 |
protected JTableHeader |
createDefaultTableHeader() 返回默认的表标题对象,它是一个 JTableHeader 。 |
static JScrollPane |
createScrollPaneForTable(JTable aTable) 已过时。 从 Swing version 1.0.2 开始,由 new JScrollPane(aTable) 取代。 |
void |
doLayout() 使此表布局其行和列。 |
boolean |
editCellAt(int row, int column) 如果 row 和 column 位置的索引在有效范围内,并且这些索引处的单元格是可编辑的,则以编程方式启动该位置单元格的编辑。 |
boolean |
editCellAt(int row, int column, EventObject e) 如果 row 和 column 位置的索引在有效范围内,并且这些索引处的单元格是可编辑的,则以编程方式启动该位置单元格的编辑。 |
void |
editingCanceled(ChangeEvent e) 编辑取消时调用。 |
void |
editingStopped(ChangeEvent e) 编辑结束时调用。 |
AccessibleContext |
getAccessibleContext() 获取与此 JTable 关联的 AccessibleContext。 |
boolean |
getAutoCreateColumnsFromModel() 确定表是否要根据模型创建默认的列。 |
boolean |
getAutoCreateRowSorter() 如果每当模型更改时,都应该创建一个新 RowSorter 并作为该表的排序器安装,则返回 true ;否则,返回 false 。 |
int |
getAutoResizeMode() 返回表的自动调整模式。 |
TableCellEditor |
getCellEditor() 返回活动单元格编辑器;如果该表当前没有被编辑,则返回 null 。 |
TableCellEditor |
getCellEditor(int row, int column) 返回适用于由 row 和 column 所指定单元格的编辑器。 |
Rectangle |
getCellRect(int row, int column, boolean includeSpacing) 返回位于 row 和 column 相交位置的单元格矩形。 |
TableCellRenderer |
getCellRenderer(int row, int column) 返回适于由此行和列所指定单元格的渲染器。 |
boolean |
getCellSelectionEnabled() 如果同时启用了行选择模型和列选择模型,则返回 true。 |
TableColumn |
getColumn(Object identifier) 返回表中列的 TableColumn 对象,当使用 equals 进行比较时,表的标识符等于 identifier 。 |
Class<?> |
getColumnClass(int column) 返回出现在视图中 column 列位置处的列类型。 |
int |
getColumnCount() 返回列模型中的列数。 |
TableColumnModel |
getColumnModel() 返回包含此表所有列信息的 TableColumnModel 。 |
String |
getColumnName(int column) 返回出现在视图中 column 列位置处的列名称。 |
boolean |
getColumnSelectionAllowed() 如果可以选择列,则返回 true。 |
TableCellEditor |
getDefaultEditor(Class<?> columnClass) 尚未在 TableColumn 中设置编辑器时,返回要使用的编辑器。 |
TableCellRenderer |
getDefaultRenderer(Class<?> columnClass) 尚未在 TableColumn 中设置渲染器时,返回要使用的单元格渲染器。 |
boolean |
getDragEnabled() 返回是否启用自动拖动处理。 |
JTable.DropLocation |
getDropLocation() 返回对组件的 DnD 操作期间此组件应该可见地指示为放置位置的位置;如果当前没有显示任何位置,则返回 null 。 |
DropMode |
getDropMode() 返回此组件的放置模式。 |
int |
getEditingColumn() 返回包含当前被编辑的单元格的列索引。 |
int |
getEditingRow() 返回包含当前被编辑的单元格的行索引。 |
Component |
getEditorComponent() 返回处理编辑会话的组件。 |
boolean |
getFillsViewportHeight() 返回此表是否始终大到足以填充封闭视口的高度。 |
Color |
getGridColor() 返回用来绘制网格线的颜色。 |
Dimension |
getIntercellSpacing() 返回单元格之间的水平间距和垂直间距。 |
TableModel |
getModel() 返回提供此 JTable 所显示数据的 TableModel 。 |
Dimension |
getPreferredScrollableViewportSize() 返回此表视口的首选大小。 |
Printable |
getPrintable
|