(swing读书笔记)JTable简介(上)
来源:互联网 发布:迅雷校园招聘java笔试 编辑:程序博客网 时间:2024/05/17 23:53
(swing读书笔记)JTable简介(上)
by cszhao1980
JTable是Swing中最复杂的组件之一。在JTable周围,环绕着JTableHeader、TableModel、TableColumn、TableColumnModel、ListSelectionModel、TableRowSorter
等多个辅助类(接口),如下图所示。
理解这些类(接口)之间的关系就显得尤为重要。
一.JTable与JTableHeader
JTableHeader用来管理JTable的Header对象,通过JTable. getTableHeader()方法可以直接访问到JTableHeader对象。
某种意义上,TableHeader与Table维持了一种松散的关系,即TableHeader仅作为列名字使用,而不是Table的内容。比如:
(1) 在JTable绘制自己时,就不绘制Header部分——JTableHeader本身是个组件,可以通过在容器内添加TableHeader自身来完成Header的绘制;
(2) JTable的Row数里是不包含Header行的。
JScrollPane组件对JTable进行了特殊的处理,它会自动获取JTable的TableHeader,并将该组件添加到Column Viewport中。
二.TableColumn与TableColumnModel
TableColumn是JTable的具体的某一列,通过它可以设置该列的一些属性,如首选宽度、最小、最大宽度
Header的CellRenderer,列的CellRenderer、CellEditor etc。
在TableColumn中,Header部分使用特殊字段来表示。如,headerValue、headerRenderer。
而且如果没有对该设置该列的headerRenderer时,该字段为Null。此时,选用JTableHeader. getDefaultRenderer()返回的Renderer进行绘制。
TableColumn还用来充当JTable与TableModel
之间的桥梁——protected属性modelIndex内记录的就是该列在TableColumnModel内的Index值——TableColumn有多个构造函数使用modelIndex作为参数,即该TableColumn即为TableColumnModel中的index为modelIndex的列。这段话听来来比较绕,难以理解。其实是这样的: 作为TableModel
的视图,JTable与其Model保持了非常松散的关系。比如,我们可以在视图中对各列重新排序,而此时,Model中的列根本不受影响。
【注】:使用“索引”技术,可以很方便的实现不影响Model的排序。如:swing.pdf中就给出了一个使用装饰者模式包装真实Model,以“行索引”实现行排序的功能,短短几十行代码,就完成了这项功能。
接口TableColumnModel不是某个具体的Column,而是对所有Column进行管理。它还管理了若干属性——所有的TableColumn(表格列)都应该遵守,如ColumnMargin(列边距)等。它常用的方法有:
(1) 监听器的添加、去除(TableColumnModelListener);
(2) 添加、删除、移动列;
(3) 列选取(选取 控制);
(4) 其他,如:
getColumnMargin()
getColumnIndexAtX(int xPosition)
返回位于该水平点 xPosition
位置列的索引;如果该点位于任何列边界外,则返回 -1。 在维护 Swing 的可分离模型架构的过程中,TableColumnModel 并不了解表的各列实际出现在屏幕上的方式。列的虚拟展示由使用此模型(通常是 JTable)的 view/controller 对象负责。view/controller 不必从左到右按顺序显示这些列。例如,为了适应语言环境的优先选择,可以从右到左显示各列,或者可能根据用户的请求隐藏某些列。因为该模型不了解各列在屏幕上的排列方式,所以不应将给定的xPosition
考虑为 2D 图形空间中的坐标。相反,应将其考虑为从模型中第一列开始的宽度。如果要求 2D 空间中给定 X 坐标的列索引,则可以使用JTable.columnAtPoint
。
三.JTable与TableModel
JTable与其TableModel间维持一种非常松散的联系——只要实现TabelModel接口的类都可以作为其模型。而JTable仅通过TabelModel接口定义的方法来访问模型数据——它根本不关心Model内部数据的具体存放方式。TableModel接口并不复杂:
void
addTableModelListener(TableModelListener l)
每当数据模型发生更改时,就将一个侦听器添加到被通知的列表中。
Class<?>
getColumnClass(int columnIndex)
针对列中所有的单元格值,返回最具体的超类。
int
getColumnCount()
返回该模型中的列数。
String
getColumnName(int columnIndex)
返回 columnIndex 位置的列的名称。
int
getRowCount()
返回该模型中的行数。
Object
getValueAt(int rowIndex, int columnIndex)
返回 columnIndex 和 rowIndex 位置的单元格值。
boolean
isCellEditable(int rowIndex, int columnIndex)
如果 rowIndex 和 columnIndex 位置的单元格是可编辑的,则返回 true。
void
removeTableModelListener(TableModelListener l)
每当数据模型发生更改时,就从被通知的列表中移除一个侦听器。
void
setValueAt(Object aValue, int rowIndex, int columnIndex)
将 columnIndex 和 rowIndex 位置的单元格中的值设置为 aValue。
大多数方法都比较好理解,如:
(1) getValueAt(row, column)——通过该方法,JTable获取每个Cell的值;
(2) getColumnName(row, column) —— JTable获取column name;
值得一提的是getColumnClass(column), 通过调用该方法,JTable可以获取每一列(存储内容class)的Class对象,来决定该Column的default Renderer。
Swing提供了默认的TableModel实现,供大家选用,如下图所示。
AbstractTableModel实现TableModel接口,此抽象类为 TableModel
接口中的大多数方法提供默认实现。它负责管理侦听器,并为生成TableModelEvents
以及将其调度到侦听器提供方便。要创建一个具体的TableModel
作为 AbstractTableModel
的子类,只需提供对以下三个方法的实现:
public int getRowCount();
public int getColumnCount();
public Object getValueAt(int row, int column);
该抽象类:
(1) setValueAt()为空实现;
(2) getColumnClass()均返回Object Class对象。
这会使用EDIT作为defaultRenderer,显示的内容为Cell存放对象的toString的返回值。
DefaultTableModel扩展了AbstractTableModel抽象类,它使用Vector来存放模型数据,可以使用getDataVector()来获取该vector。
public Vector getDataVector()
返回由多个包含表数据值的 Vector 组成的 Vector。外层 vector 中包含的每个 vector 都是一行的值。换句话说,要获得第 1 行、第 5 列的单元格,可以使用以下代码:
((Vector)getDataVector().elementAt(1)).elementAt(5);
同AbstractTableModel一样,getColumnClass()也返回Object Class对象,可以重载此方法,以返回更加准确的类型。
四.ListSelectionModel
同JList一样,JTable也使用ListSelectionModel来管理其选取,共有三种选取模式(属性:SelectionModel):
static int
MULTIPLE_INTERVAL_SELECTION
selectionMode 属性的值:一次选择一个或多个连续的索引范围。
static int
SINGLE_INTERVAL_SELECTION
selectionMode 属性的值:一次选择一个连续的索引范围。
static int
SINGLE_SELECTION
selectionMode 属性的值:一次选择一个列表索引。
通过JTable..getSelectionModel()可以访问它的选取模型。
JTable还提供了以下方法,对选取进行控制:
(1) setColumnSelectionAllowed(boolean);
(2) setRowSelectionAllowed(boolean);
(3) setCellSelectionEnabled(boolean);
- (swing读书笔记)JTable简介(上)
- (swing读书笔记)JTable简介(中)
- (swing读书笔记)JTable简介(下)
- (swing读书笔记)JTree简介(上)
- (swing读书笔记)JTree简介(中)
- (swing读书笔记)JTree简介(下)
- (swing读书笔记)Undo/Redo(上)
- Swing中 JTable用法简介之宏观篇(包括与数据库的连接)
- Swing JTable例子(如何创建一个JTable)
- Swing基本组件使用4(JTable)
- (swing读书笔记)引子
- (swing读书笔记)ProgressMonitor
- Java Swing JTable
- Java Swing-JScrollPane,JTable
- swing jTable 自定义单元格
- Swing JTable复杂报表
- swing jtable常用
- swing jtable表头设置
- STM32F103的ADC问题
- 程序员成长路上的团队修炼之道
- 往下拖动页面滚动条时,固定住菜单栏(不随其他内容网上滚动,兼容各版本IE、Chrome、Firefox)
- maximo 日期格式调整
- SNS社交平台的核心技术架构
- (swing读书笔记)JTable简介(上)
- SQL ERROR 17002
- (swing读书笔记)JTable简介(中)
- linux基础之文件锁,读写锁相关
- 关于bcb6.0编译错误:[Linker Fatal Error] Fatal: Illegal option
- (swing读书笔记)JTable简介(下)
- const常用小结
- 共享内存区
- (swing读书笔记)JTree简介(上)