关于JTable的使用
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提供了两个实现了这个接口的类:
AbstractTableModel, DefaultTableModel 也就是说我们在在写自己的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的使用的更多相关文章
- swing中JTable的使用方法
public static void main(String[] args) { Student s1 = new Student("张三", "001", 0 ...
- Jtable 表格按多列排序(支持中文汉字排序)
这两天公司让做一个Jtable表格的排序,首先按A列排序,在A列相等时按B列排序,B列相等时按C列排序,ABC三列可以任意指定,最多分三列,这样的一个需求.由于我是大神,所以必须做了出来.ok,不自恋 ...
- Java — JTree and JTable以及sqlServer的两种连接
使用JTree的步骤: 暂时只能创建一个头结点,创建一个树的结点作为头结点(其子结点也是相同的创建方法):DefaultMutableTreeNode headNode = new DefaultMu ...
- ABP JTable如何手动刷新子表数据
function getSubMaster() { _$masterTable.find('.jtable-child-table-container').jtable('reload'); }
- jtable插件api
官网2016-03-15 事例图: 一.客户端配置 1. paging boolean default:false 配置是否分页,果断改为true. 2. pageList string defaul ...
- ASP.NET ZERO 学习 JTable的使用子表闭合功能
双击子表自动判定开闭功能 //CHILD TABLE DEFINITION FOR "PHONE NUMBERS" Phones: { title: '', width: '5%' ...
- ASP.NET ZERO 学习 JTable的ChildTable用法
效果图: Jtable的子表用法: _$masterTable.jtable({ title: app.localize('PharmacyInventory'), openChildAsAccord ...
- jtable更新数据
static JTable table; public void refrushTableData() { String[] columnNames = { " }; String[][] ...
- 实现Java JTable的应用案例
代码如下 import Java.awt.Component; import java.awt.Dimension; import java.awt.FontMetrics; import javax ...
- JavaSE GUI显示列表 JTable的刷新 重新加载新的数据
JTable在显示所有数据之后,假如需要搜索某个名字,则会获取新的列表数据. 假设datas是JTable的数据,定义为: private Vector<Vector> datas = n ...
随机推荐
- 获取当前时间 YYYY-MM-DD
1.函数封装 /** * 获取当前时间 * 格式YYYY-MM-DD */ Vue.prototype.getNowFormatDate = function() { var date = new D ...
- CodeForces 404 Marathon ( 浮点数取模 -- 模拟 )
B. Marathon time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...
- Java线程池的简单使用
最近由于公司的业务需求,需要使用线程池来进行对数据进行处理,所以就简单的学习了一下线程池的东西,刚接触感觉挺难的,不过使用了就不感觉那么难了,还是蛮简单的, package com.yd.sms.jo ...
- string 是值类型,还是引用类型(.net)[转]
转自http://hi.baidu.com/newfzks/item/b805f0f4edb0810dd89e7290 string 是值类型,还是引用类型(.net) 一. string 类型的用法 ...
- 创业公司做数据分析(四)ELK日志系统
作为系列文章的第四篇.本文将重点探讨数据採集层中的ELK日志系统.日志.指的是后台服务中产生的log信息,一般会输入到不同的文件里.比方Django服务下,一般会有nginx日志和uWSGI日志. ...
- KindEditor使用过程中,用JQ提交表单时,获取不到编辑器的内容
首先要说明的是.在使用提交button直接提交时.编辑器的内容是能够正常获取的,而使用 jq或js ,如$("#form").submit(),提交时,则编辑器的内容是无法获取的. ...
- Android经常使用设计模式(二)
继上一篇 Android经常使用设计模式(一)里认识了观察者.适配器.代理等三种模式,这一篇将会解说下面三种模式: 工厂模式 单例模式 命令模式 1.工厂模式(Factory Pattern) 工厂模 ...
- IDEA及时更新js代码
需要在Tomcat的设置中为: on ‘update‘ action:当用户主动执行更新的时候更新 快捷键:Ctrl + F9 on frame deactication:在编辑窗口失去焦点的时候更新 ...
- bleve搜索引擎源码分析之索引——mapping真复杂啊
接下来看看下面index部分的源码实现: data := struct { Name string Des string }{ Name: "hello world this is bone ...
- 机器学习: KNN--python
今天介绍机器学习中比较常见的一种分类算法,K-NN,NN 就是 Nearest Neighbors, 也就是最近邻的意思,这是一种有监督的分类算法,给定一个 test sample, 计算这个 tes ...