关于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 ...
随机推荐
- [LeetCode][Java] Subsets
题目: Given a set of distinct integers, nums, return all possible subsets. Note: Elements in a subset ...
- Office WORD WPS如何取消拼写检查
1 审阅-修订-修订选项-拼写,全部取消勾选.
- ASP.NET没有魔法——ASP.NET MVC Razor与View渲染 ASP.NET没有魔法——ASP.NET MVC界面美化及使用Bundle完成静态资源管理
ASP.NET没有魔法——ASP.NET MVC Razor与View渲染 对于Web应用来说,它的界面是由浏览器根据HTML代码及其引用的相关资源进行渲染后展示给用户的结果,换句话说Web应用的 ...
- android 不同进程间的调用 AIDL 实现通讯服务
android 不同进程间的调用 AIDL 实现通讯服务 近期对aidl android 不同进程间的调用,不同运用间的调用做了一些尝试: 过程例如以下: 1:首先在要被调用的程序里写好 ...
- 深度学习笔记之关于基本思想、浅层学习、Neural Network和训练过程(三)
不多说,直接上干货! 五.Deep Learning的基本思想 假设我们有一个系统S,它有n层(S1,…Sn),它的输入是I,输出是O,形象地表示为: I =>S1=>S2=>….. ...
- C和Fortran互相传递动态数组
C和Fortran的相互调用传递数值的方法有很多,但是F03标准的出笼,使用ISO_C_BINDING进行C和Fortran的互相调用有着更显著的优势: 1.与编译器和平台无关: 2.Fortran中 ...
- 【java报错】CacheLoader returned null for key class
CacheLoader returned null for key class cmd mvn eclipse:clean eclipse:eclipse mvn install -Dmave ...
- java集合的关系
在 Java2中,有一套设计优良的接口和类组成了Java集合框架Collection,使程序员操作成批的数据或对象元素极为方便.这些接口和类有很多对抽象数据类型操作的API,而这是我们常用的且在数据结 ...
- HDU1166 敌兵布阵 —— 线段树单点修改
题目链接:https://vjudge.net/problem/HDU-1166 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布 ...
- YTU 2896: J--Zipper
2896: J--Zipper 时间限制: 1 Sec 内存限制: 128 MB 提交: 29 解决: 15 题目描述 Given three strings, you are to determ ...