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. vue-cli中process.env配置以及打包本地运行或者线上运行配置

    我们知道打包默认npm run build,可是打包后点击dist文件中index.html一片空白.问题在于路径问题.我们在工程文件的最外层增加文件.env.production这个文件就是这么奇怪 ...

  2. 获取Windows用户所有的账户名

    /// <summary> /// 设置用户密码 /// </summary> [DllImport("Netapi32.dll")] extern sta ...

  3. performSelector调用和直接调用的区别

    今天在准备出笔试题的过程中随便搜了一下其他的笔试题,看到其中一个就是关于performSelector与直接调用的区别. 个人感觉这其实是一个陷阱题,因为大部分应用场景下,用哪一种都可以,可以说是没有 ...

  4. 安装SQLserver2008时出现的错误

    1.SQLserver2008提示必须重新启动计算机才干够继续安装.解决方法例如以下: 在開始->执行中输入regedit,到HKEY_LOCAL_MACHINE\SYSTEM\CurrentC ...

  5. 再理解HDFS的存储机制

    再理解HDFS的存储机制 1. HDFS开创性地设计出一套文件存储方式.即对文件切割后分别存放: 2. HDFS将要存储的大文件进行切割,切割后存放在既定的存储块(Block)中,并通过预先设定的优化 ...

  6. Servlet学习总结,为理解SpringMVC底层做准备

    Servlet 一句话概括 :处理web浏览器,其他HTTP客户端与服务器上数据库或其他应用交互的中间层 Servlet 生命周期 : 1.类加载, 2.实例化并调用init()方法初始化该 Serv ...

  7. 2016/2/25 onchange 应用

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. FFT做题记录

    FFT是用来快速求卷积的..... 那么卷积有什么作用呢 https://www.zhihu.com/question/22298352 看完就懂了

  9. MVC优缺点

    1.通过把项目分成model view和controller,使得复杂项目更加容易维护. 2.没有使用view state和服务器表单控件,可以更方便的控制应用程序的行为 3.应用程序通过contro ...

  10. UVA - 11488 Hyper Prefix Sets(trie树)

    1.给n个只含0.1的串,求出这些串中前缀的最大和. 例1: 0000 0001 10101 010 结果:6(第1.2串共有000,3+3=6) 例2: 01010010101010101010 1 ...