(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简介(上)相关推荐

  1. (swing读书笔记)JTable简介(下)

    (swing读书笔记)JTable简介(下) by cszhao1980 六.Row 最初,JTable没有提供任何"Row"相关的类来控制Row,与Row相关的大量操作直接坐落在 ...

  2. (swing读书笔记)JTable简介(中)

    (swing读书笔记)JTable简介(中) by cszhao1980 五.TableCellRenderer JTable将Cell的绘制工作委托给CellRenderer来完成--如果我们没有显 ...

  3. (swing读书笔记)JTree简介(上)

    (swing读书笔记)JTree简介(上) By cszhao1980 同JTable类似,JTree也是一个负责的组件,其周围也有大量附属接口.类,如下图所示: 一.TreeNode(树节点) Tr ...

  4. (swing读书笔记)JTree简介(下)

    (swing读书笔记)JTree简介(下) By cszhao1980 六.TreeCellRenderer 通过JTable一样,JTree也使用一个接口定义它的单元绘制器,该接口仅有一个方法: C ...

  5. (swing读书笔记)JTree简介(中)

    (swing读书笔记)JTree简介(中) By cszhao1980 三.TreeModel(树模型) 同JTable相比,TreeModel接口显得不那么重要.这是Tree的特殊性造成的--Tre ...

  6. swing读书笔记转载

    (swing读书笔记)Swing Look And Feel(1) http://blog.csdn.net/cszhao1980/article/details/7343524 (swing读书笔记 ...

  7. (swing读书笔记)Undo/Redo(上)

    (swing读书笔记)Undo/Redo(上) By cszhao1980 一.UndoableEdit系列 Undo.Redo是十分有用的功能,Swing提供了一组类来协助用户完成Undo.Redo ...

  8. Swing学习系列 -- Swing读书笔记目录

    为了便于二次查找,学习,特列出Swing的目录如下 ++ Swing读书笔记 1-1Swing常用的package ++ Swing读书笔记 1-3版面管理器(Layout Menager) 1-3- ...

  9. 读书笔记-TCP简介

    @(Network)[tcp, congestion control] 读书笔记-TCP简介 本文主要记录阅读linuxtcp文章,其第二章中主要介绍了TCP拥塞控制的基础和一些发展历程,这里作为整理 ...

最新文章

  1. 原创 | 电视广告流量预测中的“常识”陷阱,你掉进去了吗?
  2. 黄海广博士的机器学习个人笔记及深度学习笔记
  3. 中国首篇Science机器人子刊!北航软体机器人实验室四年成果登上封面长篇
  4. excel生成mysql语句_通过SQL语句直接实现Excel与数据库的导入导出
  5. d3.js 旋转图形_苏教版三年级数学上册6.1平移和旋转微课视频 | 练习
  6. 打开stl文件_介绍一种修复、查看以及打印STL三维模型文件的工具
  7. SpringBoot指南(六)——错误页面、单元测试、文件上传
  8. mysql的请求分发,基于 gorilla/mux 实现路由匹配和请求分发:服务单页面应用
  9. 连接svn认证失败有那些原因_SVN下载安装及使用教程(一)
  10. 【信息系统项目管理师】第9章-项目人力资源管理 知识点详细整理
  11. .NET中Web Service的异常机制
  12. 【终结版】win10 激活技巧分享
  13. 用什么软件测试电视分辨率,4k电视分辨率测试图
  14. pyinstaller(py文件转成exe)
  15. gird布局几种用法
  16. 【硬件篇之电源纹波噪声测试】
  17. 试算平衡表示例图_试算平衡表的编制步骤是什么?
  18. 2022年人工智能领域发展七大趋势
  19. 计算机科学与技术专业教学计划表
  20. 多账号自媒体工具,多平台同时发布

热门文章

  1. 六部十层参考程序,博途v15.1.1200系列。 附带设计方案
  2. PHP使用HighChart生成股票K线图详解
  3. 在计算机网络系统中一般要求误码率低于,[单选] 在计算机网络通信系统中,一般要求误码率低于()。...
  4. python列表元素为中文_python入门基础教程之Python list列表修改元素
  5. 软件测试-黑盒测试学习
  6. 凤凰卫视天气预报的背景音乐《兰花》:Yanni's With an orchid
  7. 浮动QQ在线客服amp;网站QQ在线咨询
  8. 前缀树(Trie)原理及Java实现
  9. 2022年高压电工考试模拟100题及模拟考试
  10. obv代码matlab,我只用一个“OBV”指标,就知主力是出货还是洗盘,一生只学一个指标,照样挣得万贯家财...