javax.swing

接口
异常
java.lang.Object
  继承者 java.awt.Component
      继承者 java.awt.Container
          继承者 javax.swing.JComponent
              继承者 javax.swing.JTable
所有已实现的接口:
ImageObserver, MenuContainer, Serializable, EventListener, Accessible, CellEditorListener, ListSelectionListener, RowSorterListener, TableColumnModelListener, TableModelListener, Scrollable

public class JTable
     
extends JComponent
implements TableModelListener, Scrollable, TableColumnModelListener, ListSelectionListener, CellEditorListener, Accessible, RowSorterListener

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 由包含多个 ObjectVector 组成。除了将数据从应用程序复制到 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 时,需要使用 convertRowIndexToViewconvertRowIndexToModel 进行转换。以下代码显示了如何将 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 类,可以使用 InputMapActionMapAction 对象与 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)
          将从 index0index1 之间(包含两端)的列添加到当前选择中。
 void addNotify()
          调用 configureEnclosingScrollPane 方法。
 void addRowSelectionInterval(int index0, int index1)
          将从 index0index1 之间(包含两端)的行添加到当前选择中。
 void changeSelection(int rowIndex, int columnIndex, boolean toggle, boolean extend)
          根据 toggleextend 这两个标志的状态,更新表的选择模型。
 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 是一个封闭 JScrollPaneviewportView(通常情况如此),那么可通过安装表的 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)
          如果 rowcolumn 位置的索引在有效范围内,并且这些索引处的单元格是可编辑的,则以编程方式启动该位置单元格的编辑。
 boolean editCellAt(int row, int column, EventObject e)
          如果 rowcolumn 位置的索引在有效范围内,并且这些索引处的单元格是可编辑的,则以编程方式启动该位置单元格的编辑。
 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)
          返回适用于由 rowcolumn 所指定单元格的编辑器。
 Rectangle getCellRect(int row, int column, boolean includeSpacing)
          返回位于 rowcolumn 相交位置的单元格矩形。
 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

JDK 1.6 中文手册