(swing读书笔记)JTable简介(上)
(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)
返回位于该水平点 |
三.JTable与TableModel
JTable与其TableModel间维持一种非常松散的联系——只要实现TabelModel接口的类都可以作为其模型。而JTable仅通过TabelModel接口定义的方法来访问模型数据——它根本不关心Model内部数据的具体存放方式。TableModel接口并不复杂:
void |
addTableModelListener(TableModelListener l) |
Class<?> |
getColumnClass(int columnIndex) |
int |
getColumnCount() |
String |
getColumnName(int columnIndex) |
int |
getRowCount() |
Object |
getValueAt(int rowIndex, int columnIndex) |
boolean |
isCellEditable(int rowIndex, int columnIndex) |
void |
removeTableModelListener(TableModelListener l) |
void |
setValueAt(Object aValue, int rowIndex, int columnIndex) |
大多数方法都比较好理解,如:
(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 |
static int |
SINGLE_INTERVAL_SELECTION |
static int |
SINGLE_SELECTION |
通过JTable..getSelectionModel()可以访问它的选取模型。
JTable还提供了以下方法,对选取进行控制:
(1) setColumnSelectionAllowed(boolean);
(2) setRowSelectionAllowed(boolean);
(3) setCellSelectionEnabled(boolean);
(swing读书笔记)JTable简介(上)相关推荐
- (swing读书笔记)JTable简介(下)
(swing读书笔记)JTable简介(下) by cszhao1980 六.Row 最初,JTable没有提供任何"Row"相关的类来控制Row,与Row相关的大量操作直接坐落在 ...
- (swing读书笔记)JTable简介(中)
(swing读书笔记)JTable简介(中) by cszhao1980 五.TableCellRenderer JTable将Cell的绘制工作委托给CellRenderer来完成--如果我们没有显 ...
- (swing读书笔记)JTree简介(上)
(swing读书笔记)JTree简介(上) By cszhao1980 同JTable类似,JTree也是一个负责的组件,其周围也有大量附属接口.类,如下图所示: 一.TreeNode(树节点) Tr ...
- (swing读书笔记)JTree简介(下)
(swing读书笔记)JTree简介(下) By cszhao1980 六.TreeCellRenderer 通过JTable一样,JTree也使用一个接口定义它的单元绘制器,该接口仅有一个方法: C ...
- (swing读书笔记)JTree简介(中)
(swing读书笔记)JTree简介(中) By cszhao1980 三.TreeModel(树模型) 同JTable相比,TreeModel接口显得不那么重要.这是Tree的特殊性造成的--Tre ...
- swing读书笔记转载
(swing读书笔记)Swing Look And Feel(1) http://blog.csdn.net/cszhao1980/article/details/7343524 (swing读书笔记 ...
- (swing读书笔记)Undo/Redo(上)
(swing读书笔记)Undo/Redo(上) By cszhao1980 一.UndoableEdit系列 Undo.Redo是十分有用的功能,Swing提供了一组类来协助用户完成Undo.Redo ...
- Swing学习系列 -- Swing读书笔记目录
为了便于二次查找,学习,特列出Swing的目录如下 ++ Swing读书笔记 1-1Swing常用的package ++ Swing读书笔记 1-3版面管理器(Layout Menager) 1-3- ...
- 读书笔记-TCP简介
@(Network)[tcp, congestion control] 读书笔记-TCP简介 本文主要记录阅读linuxtcp文章,其第二章中主要介绍了TCP拥塞控制的基础和一些发展历程,这里作为整理 ...
最新文章
- 原创 | 电视广告流量预测中的“常识”陷阱,你掉进去了吗?
- 黄海广博士的机器学习个人笔记及深度学习笔记
- 中国首篇Science机器人子刊!北航软体机器人实验室四年成果登上封面长篇
- excel生成mysql语句_通过SQL语句直接实现Excel与数据库的导入导出
- d3.js 旋转图形_苏教版三年级数学上册6.1平移和旋转微课视频 | 练习
- 打开stl文件_介绍一种修复、查看以及打印STL三维模型文件的工具
- SpringBoot指南(六)——错误页面、单元测试、文件上传
- mysql的请求分发,基于 gorilla/mux 实现路由匹配和请求分发:服务单页面应用
- 连接svn认证失败有那些原因_SVN下载安装及使用教程(一)
- 【信息系统项目管理师】第9章-项目人力资源管理 知识点详细整理
- .NET中Web Service的异常机制
- 【终结版】win10 激活技巧分享
- 用什么软件测试电视分辨率,4k电视分辨率测试图
- pyinstaller(py文件转成exe)
- gird布局几种用法
- 【硬件篇之电源纹波噪声测试】
- 试算平衡表示例图_试算平衡表的编制步骤是什么?
- 2022年人工智能领域发展七大趋势
- 计算机科学与技术专业教学计划表
- 多账号自媒体工具,多平台同时发布
热门文章
- 六部十层参考程序,博途v15.1.1200系列。 附带设计方案
- PHP使用HighChart生成股票K线图详解
- 在计算机网络系统中一般要求误码率低于,[单选] 在计算机网络通信系统中,一般要求误码率低于()。...
- python列表元素为中文_python入门基础教程之Python list列表修改元素
- 软件测试-黑盒测试学习
- 凤凰卫视天气预报的背景音乐《兰花》:Yanni's With an orchid
- 浮动QQ在线客服amp;网站QQ在线咨询
- 前缀树(Trie)原理及Java实现
- 2022年高压电工考试模拟100题及模拟考试
- obv代码matlab,我只用一个“OBV”指标,就知主力是出货还是洗盘,一生只学一个指标,照样挣得万贯家财...