表格(增加行号)

前面介绍了关于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相关推荐

  1. C# datagridview、datagrid、GridControl增加行号

    01 - WinForm中datagridview增加行号 在界面上拖一个控件dataGridView1,在datagridview添加行事件中添加如下代码: private void dataGri ...

  2. 学习笔记101— word 如何给某一页后面所有页增加行号

    word中 如何给特定页增加行号 1.点击"布局" ----> "行号" ----> "连续" 2.如果是从某一页的后面,才还是 ...

  3. Latex 生成的PDF增加行号 左右两边

    增加行号 \usepackage[switch]{lineno}\linenumbers \begin{document} \end{document}

  4. Linux Vim增加行号

    Linux Vim增加行号 1.打开/etc/vimrc文件 vim /etc/vimrc 2.文件第一行或者最后一行添加以下内容 "增加行号 set number 3.关闭行号 set n ...

  5. http://www.blogjava.net/heyang/archive/2010/12/02/

    2019独角兽企业重金招聘Python工程师标准>>> http://www.blogjava.net/heyang/archive/2010/12/02/339589.html 使 ...

  6. 为vim编辑器增加行号功能

    当我们打开vim编辑器的时候,没有行号的现实会让人着实头疼,怎么设置永久让他显示行号呢? 在当前用户的家目录下创建如上隐藏文件 输入: 保存后退出. 这时候在观看刚才的文件: 行号显示了出来. 但是这 ...

  7. aspxgridview 增加行号

    近日,是项目中要用到 DEVEXPRESS的ASPxGridView控件,要求能自动显示行号,现将代码共享一下. aspx页面:==================================== ...

  8. html pre标签增加行号,vue使用highlight.js 添加行号

    效果图 1587719278(1).jpg main.js import hljs from "highlight.js"; import "highlight.js/s ...

  9. js 为表格增加行 动态

    <html>         <head>     <meta   http-equiv="Content-Type"   content=" ...

最新文章

  1. 男性护肤热潮难以孕育下一个“完美日记”?
  2. AAAI 2022 | 基于词对关系建模的统一NER,刷爆14个中英NER数据集
  3. linux上还原自主nuget包需要注意的问题
  4. Vim 使用教程(搬运)
  5. asp.net 缓存Cache的使用总结
  6. 先搞定SLAM,再谈如何抓住下一代互联网产业爆发点!
  7. Python3.x:pytesseract识别率提高(样本训练)
  8. 搭建VUE环境、安装npm、node.js
  9. Java基础知识强化之集合框架笔记15:List集合的特点
  10. 北京联通 烽火光猫+烽火HG680 不拆机破解
  11. 文件上传系统php源码,PHP文件上传下载案例代码
  12. 用jquery1.9版本判断ie浏览器及ie6浏览器
  13. 阿里巴巴29个屌炸天的开源项目!
  14. 斐波那契数列c语言while,C语言数据结构递归之斐波那契数列
  15. 遇见未来 | 对话叶毓睿:人类文明运行在软件之上(上篇)
  16. 根据两点的经纬度求方位角和距离
  17. GBase 8s 入门
  18. 求和 矩阵迹的性质_怎么证明矩阵特征值的和等于矩阵的迹_
  19. 浅谈Xen和半虚拟化技术
  20. mysql死锁的原因及解决方法_mysql死锁的原因及解决方法

热门文章

  1. des算法java_Java加密算法笔记--DES算法实现
  2. MySQL手机统计信息_MySQL统计信息
  3. 为啥led灯用一年后暗了很多_有些人日间车灯可以关为啥偏偏不关?是要告诉别人他的车好吗?...
  4. 计算机系统验证课件,回顾性验证及再验证简介(ppt 42页)
  5. android组件浮动在activity上_Jetpack Hilt 依赖注入框架上手指南
  6. python行与行之间必须对齐_Python行和缩进
  7. java list_Java集合-List
  8. php7 java8_php7 vs java8 vs nodejs5 vs lua5.2 计算性能比较
  9. win10 安装MySQL过程和遇到的坑
  10. JavaScript 为什么要有 Symbol 类型?