表格(增加行号) http://www.blogjava.net/zeyuphoenix/archive/2010/04/19/318788.html
表格(增加行号)
前面介绍了关于JTable的基本使用、JTable单元格的Renderer和Editor、JTable的单元格的合并和拆分、JTableHeader的Renderer和Editor、JTableHeader的的合并和拆分等.现在介绍一种关于JTable表现的情况,比如我们从DB或者文件中取得数据之后,我们把它插入JTable之中时,我们是想知道它的行号的,但是我们排序之后行号是不应该变化的,这样我们就不能把行号的数据和JTable的数据放置在一个Model中(当然也是有办法的,比如我们重写TableModel,当数据改变时,我们重写FireTableChange方法更改数据行号,但是很复杂.)
我们一般的做法是设置另外一个JTable,重写tableChanged和propertyChange,监听主JTable的变化,当主JTable的数据变化时,我们同时也更新这个行号JTable的数据,这个就可以达到JTable的数据改变时我们行号JTable的数据也随之改变.
先看看完成的效果:
排序后,行号是不变的:
然后哦就是我们的实现了,先看行号那一列的类,先实现它的TableModel,
/**
*createtherowtablemodel.
*/
privateclass RowHeaderModel extends AbstractTableModel {
这个行JTable的TableModel是和数据JTable是关联的,我们根据数据的JTable的Model调整这个行JTable.
先是构造函数,很简单,只需要传入数据JTable的Model.
public RowHeaderModel(TableModel model) {
this.model = model;
}
接下来是TableModel的方法的复写:
@Override
publicint getColumnCount() {
return 1;
}
只有一列数据.
@Override
publicint getRowCount() {
returnmodel.getRowCount();
}
行数和数据JTable的行号一样.
@Override
public String getColumnName(int col) {
return"";
}
不显示表头.
@Override
publicboolean isCellEditable(int row, int column) {
returnfalse;
}
设置为不可编辑的.
然后就是行号JTable的单元格的表现了,我们继承TableCellRenderer,使它返回行号.
/**
*createtablecellrenderer.
*/
privateclass RowHeaderRenderer extends JButton implements
TableCellRenderer {
复写getInsets使JTable的单元格没有间隙
@Override
public Insets getInsets() {
returnnew Insets(0, 0, 0, 0);
}
然后是实现TableCellRenderer的方法:
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row, int column) {
// set cell text
this.setText("" + (row + 1));
设置行号就可以了.
然后就是行号JTable这个类了
/**
*createtherowtable.
*/
publicclass RowTable extends JTable {
实现很简单,因为JTable的Model和Rnederer已经完成了,不需要再设置数据了:
初始化设置Model和Renderer就可以了:
setModel(new RowHeaderModel(table.getModel()));
setRowHeight(table.getRowHeight());
getColumn("").setCellRenderer(new RowHeaderRenderer());
这样行号JTable就完成了,现在我们需要实现一个类继承JscrollPane,当我们需要创建JTable时,只需要根据我们的JTable创建行号JTable,然后把两个JTable放置在我们自己的JscrollPane之中就可以了.
/**
*RowtableScrollPane.
*/
publicclass RowTableScrollPane extends JScrollPane implements
PropertyChangeListener, TableModelListener {
它继承JscrollPane实现PropertyChangeListener和TableModelListener接口,当数据JTable变化时,我们同时更新行号JTable的数据.
先看属性,很简单,需要放置的两个JTable:
// row table
protected RowTable rowHeader = null;
// data table
protected JTable table = null;
构造函数也很简单,只需要传入我们的数据JTable
/**
*
*/
public RowTableScrollPane(JTable table) {
if (table == null) {
thrownew IllegalArgumentException("table is null");
}
this.table = table;
然后初始化时构造行号JTable,设置监听:
table.addPropertyChangeListener(this);
table.getModel().addTableModelListener(this);
rowHeader = new RowTable(table);
放置在JscrollPane上面:
setViewportView(table);
setRowHeaderView(rowHeader);
响应数据JTable的事件,当数据JTable变化时,同时更新行号JTable:
@Override
publicvoid propertyChange(PropertyChangeEvent e) {
if (rowHeader != null) {
rowHeader.setTableModel(table);
}
}
@Override
publicvoid tableChanged(TableModelEvent e) {
if (rowHeader != null) {
rowHeader.setTableModel(table);
}
}
最后就是使用了,它的使用也很简单,原本我们创建好JTable之后使用JscrollPane变现JTable:
//Create the scroll pane and add the table to it.
JScrollPane scrollPane = new JScrollPane(table);
现在只需要把JscrollPane换成我们自己实现的RowTableScrollPane就可以了:
RowTableScrollPane scrollPane = new RowTableScrollPane(table);
这样实现出来的JTable就自动添加上表格了.
最后再补充一点,我们可以不使用JTable作为行号的那一列,使用一个Jlist也可以了,如下图:
实现方法也一样,只需要实现Jlist的ListModel时和JTable的Model关联就可以了,和前面介绍的JTable的例子一样,把它们都放置在JscrollPane之上关联PropertyChangeListener和TableModelListener事件就可以了,就不详细介绍了,自此当然我们也可以联想到别的组件,只要我们可以实现一个组件的Model具有和JTable的数据关联的特性,就可以作出另外的效果了.
到这里为止,关于JTable的除了拖拽就算是完了,以后想到新的再补充了,下个开始写JTree的,以后要写ExtJS了,估计时间会少很多了.
表格(增加行号) http://www.blogjava.net/zeyuphoenix/archive/2010/04/19/318788.html相关推荐
- C# datagridview、datagrid、GridControl增加行号
01 - WinForm中datagridview增加行号 在界面上拖一个控件dataGridView1,在datagridview添加行事件中添加如下代码: private void dataGri ...
- 学习笔记101— word 如何给某一页后面所有页增加行号
word中 如何给特定页增加行号 1.点击"布局" ----> "行号" ----> "连续" 2.如果是从某一页的后面,才还是 ...
- Latex 生成的PDF增加行号 左右两边
增加行号 \usepackage[switch]{lineno}\linenumbers \begin{document} \end{document}
- Linux Vim增加行号
Linux Vim增加行号 1.打开/etc/vimrc文件 vim /etc/vimrc 2.文件第一行或者最后一行添加以下内容 "增加行号 set number 3.关闭行号 set n ...
- http://www.blogjava.net/heyang/archive/2010/12/02/
2019独角兽企业重金招聘Python工程师标准>>> http://www.blogjava.net/heyang/archive/2010/12/02/339589.html 使 ...
- 为vim编辑器增加行号功能
当我们打开vim编辑器的时候,没有行号的现实会让人着实头疼,怎么设置永久让他显示行号呢? 在当前用户的家目录下创建如上隐藏文件 输入: 保存后退出. 这时候在观看刚才的文件: 行号显示了出来. 但是这 ...
- aspxgridview 增加行号
近日,是项目中要用到 DEVEXPRESS的ASPxGridView控件,要求能自动显示行号,现将代码共享一下. aspx页面:==================================== ...
- html pre标签增加行号,vue使用highlight.js 添加行号
效果图 1587719278(1).jpg main.js import hljs from "highlight.js"; import "highlight.js/s ...
- js 为表格增加行 动态
<html> <head> <meta http-equiv="Content-Type" content=" ...
最新文章
- 男性护肤热潮难以孕育下一个“完美日记”?
- AAAI 2022 | 基于词对关系建模的统一NER,刷爆14个中英NER数据集
- linux上还原自主nuget包需要注意的问题
- Vim 使用教程(搬运)
- asp.net 缓存Cache的使用总结
- 先搞定SLAM,再谈如何抓住下一代互联网产业爆发点!
- Python3.x:pytesseract识别率提高(样本训练)
- 搭建VUE环境、安装npm、node.js
- Java基础知识强化之集合框架笔记15:List集合的特点
- 北京联通 烽火光猫+烽火HG680 不拆机破解
- 文件上传系统php源码,PHP文件上传下载案例代码
- 用jquery1.9版本判断ie浏览器及ie6浏览器
- 阿里巴巴29个屌炸天的开源项目!
- 斐波那契数列c语言while,C语言数据结构递归之斐波那契数列
- 遇见未来 | 对话叶毓睿:人类文明运行在软件之上(上篇)
- 根据两点的经纬度求方位角和距离
- GBase 8s 入门
- 求和 矩阵迹的性质_怎么证明矩阵特征值的和等于矩阵的迹_
- 浅谈Xen和半虚拟化技术
- mysql死锁的原因及解决方法_mysql死锁的原因及解决方法
热门文章
- des算法java_Java加密算法笔记--DES算法实现
- MySQL手机统计信息_MySQL统计信息
- 为啥led灯用一年后暗了很多_有些人日间车灯可以关为啥偏偏不关?是要告诉别人他的车好吗?...
- 计算机系统验证课件,回顾性验证及再验证简介(ppt 42页)
- android组件浮动在activity上_Jetpack Hilt 依赖注入框架上手指南
- python行与行之间必须对齐_Python行和缩进
- java list_Java集合-List
- php7 java8_php7 vs java8 vs nodejs5 vs lua5.2 计算性能比较
- win10 安装MySQL过程和遇到的坑
- JavaScript 为什么要有 Symbol 类型?