JTable是个JavaSwing中的表格控件,可以用来显示数据和编辑数据。这里讲一下我的使用心得。

JavaSwing讲究MVC理念,而这个JTable也可以说是个迷你的MVC模型。JTable只是个显示数据的表格,而它的数据其实是在TableModel上的。每一个Jtable都会有自己的TableModel。可以这样想,你实现好了tableModel的方法,就可以自动生成表格。

有两种方法设置JTable的model:

//这个TableDataModel是实现了TableModel的类
TableDataModel tableModel = new TableDataModel(); JTable jTable = new JTable(tableModel);//
jTable.setModel(tableMoedl);

当然,我们一般不会自己去实现这个接口,Java提供了两个实现了这个接口的类:

AbstractTableModelDefaultTableModel 也就是说我们在在写自己的TableModel的时候只要extends他们就行了。

这里我们主要看看AbstractTableModel

这个类基本实现了TableModel接口的方法,但有几个我们还是一定要重写的:

public int getRowCount();
public int getColumnCount();
public Object getValueAt(int row, int column);

这三个方法,大概就是用来生成表格的,前两个确定表格的行与列数。第三个是确定每个单元格格的值。

然后还有几个有用的方法:

isCellEditable(int rowIndex, int columnIndex)---------这个方法是让某个单元格可以编辑

public String getColumnName(int column)---------告诉表格列表名

setValueAt(Object aValue, int rowIndex, int columnIndex)------------如果你的表格是可以编辑的,那么一定要实现这个方法。它是什么效果呢?它可以在数据发生改变的时候重新设置该单元格的值。如果你不重写这个方法,当你改一个单元格的值,然后回车,它又会变回去。而且你改完后,获取到的值也是原来的。     因为这个JTable的数据都是放在TableModel中的,所以,要真正地改表格的值,就要改model的数据。        重写了这个方法后,编辑完后单元格后,就不会再变回去了。

现在来看一个例子的代码

package com.wangshen.www.service;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector; import javax.swing.table.AbstractTableModel; import com.wangshen.www.dao.CheckDao; /**
* 这个类是表格的数据模型,用来实现表格的数据展示和数据管理
* @author 85060
*
*/ //一开始我特么rowData是个二维的vector,然年不知道为什么怎么重写那个setValueAt方法都做不到直接在表格上编辑,然后就换成了rowData里面装的每一行是字符串数组的形式
public class TableDataModel extends AbstractTableModel {
Vector<String> columnData = new Vector<String>();//保存列名称
Vector rowData = null; public TableDataModel() {
CheckDao checkDao = new CheckDao(); columnData.add("id");
columnData.add("书本名称");
columnData.add("书本价格");
columnData.add("收入时间");
columnData.add("是否借出(1代表已借出)");
rowData = checkDao.getRowData();
} @Override//必须要重写实现的
public int getColumnCount() {
// TODO Auto-generated method stub
return columnData.size();
} @Override//必须要重写实现的
public int getRowCount() {
// TODO Auto-generated method stub
return rowData.size();
} @Override//必须要重写实现的
public Object getValueAt(int row, int column) {
// TODO Auto-generated method stub
/*
Vector temp=((Vector)rowData.get(row));
return temp.get(column);
*/
String LineTemp[] = (String[])rowData.get(row);
return LineTemp[column];
} @Override
public String getColumnName(int column) {
// TODO Auto-generated method stub
return (String)this.columnData.get(column);
} @Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
// TODO Auto-generated method stub
if(columnIndex>0){
return true;
}
else{
return false;
}
} @Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex)
{ /*
Vector temp = (Vector)rowData.get(rowIndex);
switch(rowIndex) {
case 1:
//temp.setElementAt((String)aValue, 1);
temp.set(1,(String)aValue);
break;
case 2:
temp.setElementAt((float)aValue, 2);
break;
case 3:
temp.setElementAt((String)aValue, 3);
break;
case 4:
temp.setElementAt((Integer)aValue, 4);
break;
}
*/
// 当单元格的数据发生改变的时候掉用该函数重设单元格的数据
// 我们想一下,数据是放在TableData 中的,说白了修改数据就是修改的
// TableData中的数据,所以我们仅仅在此处将TableData的对应数据修改即可
((String[])this.rowData.get(rowIndex))[columnIndex]=(String)aValue;
super.setValueAt(aValue, rowIndex, columnIndex);
//
// 其实这里super的方法是调用了fireTableCellUpdated()只对应更新了
// 对应单元格的数据
// fireTableCellUpdated(rowIndex, columnIndex);
} }
(补一下,这个Vector其实就是个列表一样的东西,实现了List,和ArrayList差不多,但是个动态数组)
然后来看看Dao层中row数据的获取
package com.wangshen.www.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector; import com.wangshen.www.util.DbUtil; /**
* 这个类是获取整个图书表的一个resultset
* @author 85060
*
*/
public class CheckDao {
DbUtil dbUtil = new DbUtil(); public Vector getRowData() {//返回一个Vector,就是一个表格的row信息
Connection con = dbUtil.getCon();//获取数据库连接
String sql = "SELECT * FROM t_books";
PreparedStatement pstmt = null;
ResultSet rs = null;
Vector rowData = new Vector();//用来保存数据库中的行结果 try { pstmt = con.prepareStatement(sql);
rs = pstmt.executeQuery();
while(rs.next()) {
//Vector hang=new Vector();
String[] temp = new String[50];
int i = 0;
/*
hang.add(rs.getInt("id"));
hang.add(rs.getString("bookName"));
hang.add(rs.getFloat("price"));
hang.add(rs.getString("time"));
hang.add(rs.getInt("status"));
rowData.add(hang);
*/
temp[i++] = rs.getInt("id")+"";
temp[i++] = rs.getString("bookName")+"";
temp[i++] = rs.getFloat("price")+"";
temp[i++] = rs.getString("time")+"";
temp[i++] = rs.getInt("status")+"";
rowData.add(temp);
} } catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("查找数据库行信息的数据库操作出错");
} finally {
dbUtil.close(pstmt, con);
}
return rowData;
}
}

每个Vector变量(row的数据)里面是n个一维的字符串数组,代表着表格中的n行数据。


再来看JTable的建立
JPanel panelTable = new JPanel();//用来装表格的panel

TableModel tableModel = new TableDataModel();//table模型,这就话同时初始化表格

JTable tableBooks = new JTable();//不要这里加model好,以后同步不方便……

//官方api建议我们这样做,就是用个有滚轮的Panel来装这个表格,就当做表格的一部分吧
JScrollPane scrollPane = new JScrollPane(tableBooks); scrollPane.setViewportView(tableBooks);//其实好像和那个构造方法的效果一样……但有
些例子加了就加吧…… panelTable.add(scrollPane); tableBooks.setFillsViewportHeight(true);//表格充满容器,不加这一句表格不会充满容器panelTable。(似乎scrollPane是跟着table一起充满panelTable)
然后关于其他操作,只要抓住表格显示的数据是TableModel里的数据这点就行了。

补充:  之前实现刷新,是重新搞个新的TableModel的实现对象,然后再
table.setModel
来实现表格的更新。 后面知道,你如果用的是Vector或者List,只要你重写好了TableModel里面需要重写的方法,你只需要在改变你的model里面的类变量,比如行数据rowData后,再调用
table.updateUi()
就可以实现表格的更新,效果还挺好!!

关于JTable的使用的更多相关文章

  1. swing中JTable的使用方法

    public static void main(String[] args) { Student s1 = new Student("张三", "001", 0 ...

  2. Jtable 表格按多列排序(支持中文汉字排序)

    这两天公司让做一个Jtable表格的排序,首先按A列排序,在A列相等时按B列排序,B列相等时按C列排序,ABC三列可以任意指定,最多分三列,这样的一个需求.由于我是大神,所以必须做了出来.ok,不自恋 ...

  3. Java — JTree and JTable以及sqlServer的两种连接

    使用JTree的步骤: 暂时只能创建一个头结点,创建一个树的结点作为头结点(其子结点也是相同的创建方法):DefaultMutableTreeNode headNode = new DefaultMu ...

  4. ABP JTable如何手动刷新子表数据

    function getSubMaster() { _$masterTable.find('.jtable-child-table-container').jtable('reload'); }

  5. jtable插件api

    官网2016-03-15 事例图: 一.客户端配置 1. paging boolean default:false 配置是否分页,果断改为true. 2. pageList string defaul ...

  6. ASP.NET ZERO 学习 JTable的使用子表闭合功能

    双击子表自动判定开闭功能 //CHILD TABLE DEFINITION FOR "PHONE NUMBERS" Phones: { title: '', width: '5%' ...

  7. ASP.NET ZERO 学习 JTable的ChildTable用法

    效果图: Jtable的子表用法: _$masterTable.jtable({ title: app.localize('PharmacyInventory'), openChildAsAccord ...

  8. jtable更新数据

    static JTable table; public void refrushTableData() { String[] columnNames = { " }; String[][] ...

  9. 实现Java JTable的应用案例

    代码如下 import Java.awt.Component; import java.awt.Dimension; import java.awt.FontMetrics; import javax ...

  10. JavaSE GUI显示列表 JTable的刷新 重新加载新的数据

    JTable在显示所有数据之后,假如需要搜索某个名字,则会获取新的列表数据. 假设datas是JTable的数据,定义为: private Vector<Vector> datas = n ...

随机推荐

  1. 爬取指定网页的源代码显示在GUI中

    建立一个GUI图形界面用来用来输入网址和代码显示的区域 #encoding=utf-8 __author__ = 'heng' #创建一个可以抓取输入网址源代码的GUI from urllib2 im ...

  2. HDU 3469 Catching the Thief (博弈 + DP递推)

    Catching the Thief Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  3. 【iOS系列】-单例模式的实现

    1:重写allocWithZone方法 allocWithZone方法是对象分配内存空间时, alloc方法最终会调用这个方法 + (id)allocWithZone:(struct _NSZone ...

  4. Webx框架:依赖注入

    Webx的依赖注入和Spring的依赖注入很像,仅仅是有一点点的差别. 注入的时候仅仅能让生命周期长的注入到生命周期短的对象中,比方requestScope对象注入到singleton时就会错误发生. ...

  5. 实现@using{}代码块

    前几天,我要写个插件,放在asp.net mvc的view上.这需要写一些扩展HtmlHelper功能的方法.这些方法的一个参数是一段javascript代码. 假如这个参数类型是字符型,当然很简单了 ...

  6. 2016/5/6 thinkphp ①框架 ② 框架项目部署 ③MVC模式 ④控制器访问及路由解析 ⑤开发和生产模式 ⑥控制器和对应方法创建 ⑦视图模板文件创建 ⑧url地址大小写设置 ⑨空操作空控制器 ⑩项目分组

    真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维护项目,十分困难,代码风格不一样) 项目稳 ...

  7. 我要开启vue2新征程。

    最近我们Team接到一个新项目,给财务部开发一个内部用的结算系统. 我想了想,心里这个兴奋啊(内部系统诶,可以大胆一点的用vue2了...) 又多了一个能练手的项目,之前的卡爷就是太坑爹了...明明v ...

  8. rip是典型的距离矢量动态路由协议。Ospf是链路状态型的协议

    网络工程师十个常见面试问题-看准网 https://m.kanzhun.com/k-mianshiwenti/1465113.html 两者都属于IGP协议,rip是典型的距离矢量动态路由协议.Osp ...

  9. Spring Boot集成MyBatis与分页插件

    Maven依赖: <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>p ...

  10. YTU 2574: 空白格式化

    2574: 空白格式化 时间限制: 1 Sec  内存限制: 128 MB 提交: 233  解决: 118 题目描述 恭喜你进入了蓝桥杯总决赛,本次大赛采用了全自动机器测评系统. 如果你的答案与标准 ...