JTable用于显示和编辑常规的二维单元格表。有关面向任务的文档和使用JTable的示例,请参见Java教程中的如何使用表。
JTable具有许多功能,可以自定义其呈现和编辑功能,但是为这些功能提供了默认设置,因此可以轻松设置简单的表。例如,要建立一个包含10行10列数字的表:
TableModel dataModel = new AbstractTableModel(){
Public int getColumnCount(){返回10; }
Public int getRowCount(){返回10;}
Public Object getValueAt(int row,int col){返回新的Integer(row * col); }
};
JTable表=新的JTable(dataModel);
JScrollPane scrollpane =新的JScrollPane(table);
JTable通常放置在JScrollPane内部。默认情况下,JTable将调整其宽度,从而不需要水平滚动条。要允许水平滚动条,请使用AUTO_RESIZE_OFF调用setAutoResizeMode(int)。请注意,如果希望在独立视图中(在JScrollPane外部)使用JTable并希望显示标头,则可以使用getTableHeader()获取它并单独显示它。
要启用行的排序和过滤,请使用RowSorter。您可以通过以下两种方式之一设置行排序器:
直接设置RowSorter。例如:table.setRowSorter(new TableRowSorter(model))。
将autoCreateRowSorter属性设置为true,以便JTable为您创建RowSorter。例如:setAutoCreateRowSorter(true)。
在设计使用JTable的应用程序时,值得密切注意将代表表数据的数据结构。
DefaultTableModel是一个模型实现,它使用对象矢量向量存储单元格值。除了将数据从应用程序复制到DefaultTableModel之外,还可以将数据包装在TableModel接口的方法中,以便可以将数据直接传递到JTable,如上例所示。由于模型可以自由选择最适合数据的内部表示形式,因此通常可以提高应用程序的效率。
确定是使用AbstractTableModel还是DefaultTableModel的一个很好的经验法则是
源分发的演示区域中的“ TableExample”目录提供了一些JTable使用情况的完整示例,涵盖了如何使用JTable提供从数据库获取的数据的可编辑视图以及如何修改显示中的列。使用专门的渲染器和编辑器。
JTable仅使用整数来引用它显示的模型的行和列。 JTable只是采用表格形式的单元格范围,并在绘制过程中使用getValueAt(int,int)从模型中检索值。重要的是要记住,由各种JTable方法返回的列和行索引是根据JTable(视图)而言的,不一定与模型使用的索引相同。
默认情况下,列可能会在JTable中重新排列,以使视图的列以与模型中的列不同的顺序出现。这一点根本不影响模型的实现:对列进行重新排序时,JTable在内部维护列的新顺序并在查询模型之前转换其列索引。
因此,在编写TableModel时,不必侦听列重新排序事件,因为无论视图中发生什么,都将在其自身的坐标系中查询模型。在示例区域中,展示了一种排序算法的演示,该算法正是使用此技术来插入另一个坐标系,在该坐标系中行的顺序发生了变化,而不是列的顺序发生了变化。
同样,使用RowSorter提供的排序和筛选功能时,底层的TableModel不需要知道如何进行排序,而是由RowSorter进行处理。当将JTable的基于行的方法与基础TableModel一起使用时,必须进行坐标转换。所有基于JTables行的方法都是基于RowSorter的,不一定与基础TableModel的相同。例如,选择始终是根据JTable进行的,因此,在使用RowSorter时,您将需要使用convertRowIndexToView或convertRowIndexToModel进行转换。下面显示了如何将JTable的坐标转换为基础模型的坐标:
Int []选择= table.getSelectedRows();
For(int i = 0; i selection.length; i ++){
Selection [i] = table.convertRowIndexToModel(selection [i]);
}
//现在根据基础TableModel进行选择
默认情况下,如果启用了排序,则JTable将根据排序模型保留选择和可变行高。例如,如果第0行
JTable,表格。用来显示和编辑二维表。
添加表格到容器中有两种方式:
创建空表格,后续再添加相应数据
JTable()
创建指定行列数的空表格,表头名称默认使用大写字母(A, B, C …)依次表示
JTable(int numRows, int numColumns)
创建表格,指定 表格行数据 和 表头名称
JTable(Object[][] rowData, Object[] columnNames)
使用表格模型创建表格
JTable(TableModel dm)
JTable 字体 和 网格 颜色设置:
// 设置内容字体
void setFont(Font font)
// 设置字体颜色
void setForeground(Color fg)
// 设置被选中的行前景(被选中时字体的颜色)
void setSelectionForeground(Color selectionForeground)
// 设置被选中的行背景
void setSelectionBackground(Color selectionBackground)
// 设置网格颜色
void setGridColor(Color gridColor)
// 设置是否显示网格
void setShowGrid(boolean showGrid)
// 水平方向网格线是否显示
void setShowHorizontalLines(boolean showHorizontalLines)
// 竖直方向网格线是否显示
void setShowVerticalLines(boolean showVerticalLines)
JTable 表头 设置:
// 获取表头
JTableHeader jTableHeader = jTable.getTableHeader();
// 设置表头名称字体样式
jTableHeader.setFont(Font font);
// 设置表头名称字体颜色
jTableHeader.setForeground(Color fg);
// 设置用户是否可以通过在头间拖动来调整各列的大小。
jTableHeader.setResizingAllowed(boolean resizingAllowed);
// 设置用户是否可以拖动列头,以重新排序各列。
jTableHeader.setReorderingAllowed(boolean reorderingAllowed);
// 设置所有行的行高
void setRowHeight(int rowHeight)
// 设置指定行的行高
void setRowHeight(int row, int rowHeight)
/**
JTable.AUTO_RESIZE_ALL_COLUMNS 在所有的调整大小操作中,按比例调整所有的列。
JTable.AUTO_RESIZE_LAST_COLUMN 在所有的调整大小操作中,只对最后一列进行调整。
JTable.AUTO_RESIZE_NEXT_COLUMN 在 UI 中调整了一个列时,对其下一列进行相反方向的调整。
JTable.AUTO_RESIZE_OFF 不自动调整列的宽度;使用滚动条。
JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS 在 UI 调整中,更改后续列以保持总宽度不变;此为默认行为。
*/
void setAutoResizeMode(int mode)
/*
// 设置列的宽度、首选宽度、最小宽度、最大宽度
tableColumn.setWidth(int width);
tableColumn.setPreferredWidth(int preferredWidth);
tableColumn.setMinWidth(int minWidth);
tableColumn.setMaxWidth(int maxWidth);
// 调整该列的列宽,以适合其标题单元格的宽度。
tableColumn.sizeWidthToFit();
// 是否允许手动改变该列的列宽
tableColumn.setResizable(boolean isResizable);
// 设置该列的表头名称
tableColumn.setHeaderValue(Object headerValue);
表格数据的简单设置和获取
// 设置表格中指定单元格的数据
jTable.getModel().setValueAt(Object aValue, int rowIndex, int columnIndex);
// 获取表格中指定单元格的数据
Object value = jTable.getModel().getValueAt(int rowIndex, int columnIndex);
创建带滚动条的表格基本步骤:
创建表格
JTable table = new JTable(…);
设置表格相关数据
// 设置滚动面板视口大小(超过该大小的行数据,需要拖动滚动条才能看到)
table.setPreferredScrollableViewportSize(new Dimension(int width, int height));
TableModel 接口指定了 JTable 用于询问表格式数据模型的方法。TableModel 封装了表格中的各种数据,为表格显示提供数据。上面案例中直接使用行数据和表头创建表格,实际上JTable 内部自动将传入的行数据和表头封装成了 TableModel。
只要数据模型实现了 TableModel 接口,就可以通过以下两行代码设置 JTable 显示该模型:
TableModel myData = new MyTableModel();
JTable table = new JTable(myData);
TableModel 接口中的方法:
/** 返回总行数 */
public int getRowCount();
/** 返回总列数 */
public int getColumnCount();
/** 返回指定列的名称(表头名称) */
public String getColumnName(int columnIndex);
/** 针对列中所有的单元格值,返回最具体的超类。JTable 使用此方法来设置列的默认渲染器和编辑器。 */
public Class> getColumnClass(int columnIndex);
判断指定单元格是否可编辑
如果行和列中的单元格是可编辑的,则返回true。否则,在单元格上调用setValueAt将无效。
注意:该列是按表视图的显示顺序指定的,而不是按TableModel的列顺序指定的。这是一个重要的区别,因为当用户重新排列表中的列时,视图中给定索引处的列将发生变化。同时,用户的操作永远不会影响模型的列顺序。
/** 获取指定单元格的值 */
public Object getValueAt(int rowIndex, int columnIndex);
/** 设置指定单元格的值 */
public void setValueAt(Object aValue, int rowIndex, int columnIndex);
/** 添加表格模型监听器 */
public void addTableModelListener(TableModelListener l);
/** 移除表格模型监听器 */
public void removeTableModelListener(TableModelListener l);
}
JRE 中常用的已实现 TableModel 接口的类有两个:
(1)javax.swing.table.AbstractTableModel
此抽象类为 TableModel 接口中的大多数方法提供默认实现。它负责管理侦听器,并为生成 TableModelEvents 以及将其调度到侦听器提供方便。要创建一个具体的 TableModel 作为 AbstractTableModel 的子类,只需提供对以下三个方法的实现:
public int getRowCount();
public int getColumnCount();
public Object getValueAt(int row, int column);
(2)javax.swing.table.DefaultTableModel
这是 TableModel 的一个实现,它使用一个 Vector 来存储单元格的值对象,该 Vector 由多个 Vector 组成。DefaultTableModel 还增加了许多方便操作表格数据的方法,例如 支持 添加 和 删除 行列 等操作。