一期的毕业设计中用到了JTable控件,具体而言,是将数据库中的内容显示到JTable上,再将这个JTable控件加到一个JScrollPane(能滚动的面板)上 ,因为小组成员都要用到,所以我写了一个公用的类,只要把列名(是一个String数组)以及一个SQL的查询语句当作参数,调用这个类的jianbiao方法就能返回一个JPanel,另外还提供了返回JTable对象与DefaultTableModel对象的方法。颇为简单,下面就是这个类。
package chongyong;
import javax.swing.JTable;
import javax.swing.JScrollPane;
import java.awt.GridLayout;
import java.sql.ResultSet;
import java.awt.Cursor;
import java.sql.SQLException;
import javax.swing.JPanel;
import javax.swing.table.DefaultTableModel;
import java.util.Vector;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.BorderLayout;
/**
*
Title:
只要传入一个字符数组、一个SQL字符串就会返回以这字符串数组为列名以SQL字符串为内容的表格
Copyright: Copyright (c) 2006
Company:
//为了方面于大家给表格加一些属性,所以用此方法返回本类生成的JTable对象
public JTable return_table() {
return table;
}
public DefaultTableModel return_table_model(){
return tableModel;
}
//本类的构造方法
public autojianbiao() {
super();
}
public JPanel jianbiao(String[] columnNames, String sqlStr) {
//表格列向量;
Vector cell;
//表格行向量;
Vector row = new Vector();
//声明表格模型;
tableModel = new DefaultTableModel();
//将表格头转换过向量类型,以备表格模型使用;
Vector tableHeadName = new Vector();
for (int i = 0; i < columnNames.length; i++) {
tableHeadName.add(columnNames[i]);
}
//初始化表格数据,这些数据实例运行来源于数据库中;
db db1 = new db();
ResultSet rs = db1.select(sqlStr);
try {
while (rs.next()) {
cell = new Vector();
for (int i = 1; i <= columnNames.length; i++) {
cell.add(rs.getString(i));
}
row.add(cell);
}
} catch (SQLException ex) {
}
//设置表格模型;
tableModel.setDataVector(row, tableHeadName);
//表格使用模型;
table = new JTable(tableModel);
//table.setRowHeight(20);
//new Cursor(1)设置鼠标指针样式,12为手形;
table.setCursor(new Cursor(12));
//把表格加在scrollPane组件上;
JScrollPane scrollPane = new JScrollPane();
scrollPane.getViewport().add(table);
//设置光标为手形;
scrollPane.setCursor(new Cursor(12));
//定义面板;
JPanel pan = new JPanel();
pan.setLayout(new BorderLayout());
pan.add(scrollPane);
//设置窗体
pan.setSize(737, 160);
//把这个JPanel返回,以方便大家调用
return pan;
}
}
后来的使用过程中,我总结出很多问题,拿出来和大家分享:
一、我要实现单击这个表格的一行,点击删除按钮,就把这行删除。
大家应该知道,要删除这行,首先得取获得点击的这行的行号,刚开始我用的inti=
tableModel.getSelectedRow(),i 就是这个行号,但是发现删除时并不能删除选择的行,解决方法:int i=table.getSelectedRow(),用table获取行号就是当前选中的行号,感觉是tableModel中还存一个副本,并不是
最新的表格样式。
二、要实现根据查询内容,变换Jtable中的内容
刚开始的实现方法是利用查询语句,重新调用一次上面创建表格的类,把这个表格添加到滚动面板上,出现
的问题:当滚动条移动时,表格不显示查询出来的内容,而是重新显示建JFrame时初始内容。解决方式:不能
重新New 表格,应该是把表格作为参数传过来后,重新写一篇根据RS的内容构造表格内容的程序,改变当前表格的内容。
所以在涉及到表格的操作里,当要根据增、删、改、查改变表格内容的时候,不要重新New表格,要改变
JtableModel,它提供了addRow()和removeRow方法,很好用。