今天下午遇到一个问题.当我从数据库从查询到数据想及时把数据更新到JScrollPane中时,不管是用updateUI()或者fireTableDataChanged()都不行.而且当我把窗口大小改变之后,JTable表却消失不见了.后面我不停的实验,发现一种很笨的方法,虽然结果是数据刷新了.现介绍给大家:
我的JTable和JScrollPane的定义如下:
<span style="font-size:18px;">JTable roomTable = new JTable();
private JScrollPane scrollPane;</span>
首先我的JTable的一行是一个Student的类,一个实体,代码如下(我只粘贴了属性,其他的没用):
public class Student {
private String account = ""; // 学生账号
private String name = ""; // 姓名
private String sex = ""; // 性别
private String classroom = "";// 班级
private String college = ""; // 院系
private String bed = ""; // 床位
private String roomnum = ""; // 寝室编号
}
然后我的JTable(
roomTable是JTable的实例
)和JScrollPane(
scrollPane是JScrollPane的实例
)是这样初始化的:
List<Student> stuList = new ArrayList<Student>();
stuList = getAllStuInfo(""); //初始化List集合,这些信息是全部学生的信息(不单指哪个寝室) 需要添加到JTable中的
studentTableModel.setStudent(stuList); //初始化TableModel
roomTable.setModel(studentTableModel); //设置JTable的TableModel
scrollPane = new JScrollPane(roomTable); //添加表到滚动面板内
我看到网上说JTable是按照MVC模式的,我还定义了一个TabelModel继承自AbstractTableModel,用来做JTable的TableModel.代码如下:
/**
* 扩展AbstractTableModel,用于将一个List<Student>集合包装成TableModel
* JTable的实现是基于MVC的, 所以JTabel的数据显示是一个独立的model的, JTable#setModel(TableModel dataModel)就是来设置model的,
* 所以你如果想动态显示数据, 你需要实现一个TableMode
*/
class StudentTableModel extends AbstractTableModel {
//保存一个Student的列表
List<Student> stuList = new ArrayList<Student>();
//设置Student列表,同时通知JTable数据对象已更改,重绘界面
public void setStudent(final List<Student> list){
//invokeLater()方法:导致 doRun.run() 在 AWT 事件指派线程上异步执行。在所有挂起的 AWT 事件被处理后才发生。
//此方法应该在应用程序线程需要更新该 GUI 时使用
SwingUtilities.invokeLater(new Runnable(){
public void run() {
stuList = list;
fireTableDataChanged(); //通知JTable数据对象已更改,重绘界面
System.out.println("更新界面");
}
});
}
//返回JTable的列数
public int getColumnCount() {
return 7;
}
//返回JTable的行数
public int getRowCount() {
return stuList.size();
}
// 从List中拿出rowIndex行columnIndex列显示的值 用于设置该TableModel指定单元格的值
public Object getValueAt(int rowIndex, int columnIndex) {
Student student = stuList.get(rowIndex); // 获取当前行的Student
switch (columnIndex) { // 根据列,返回值
case 0:
return student.getAccount(); //第一列 学号
case 1:
return student.getName(); //第二列 姓名
case 2:
return student.getSex(); //第三列 性别
case 3:
return student.getClassroom(); //第四列 班级
case 4:
return student.getCollege(); //第五列 学院
case 5:
return student.getBed(); //第六列 床位
case 6:
return student.getRoomnum(); //第七列 寝室号
default:
break;
}
return null;
}
}
这样以后,当我想更新JTable数据的时候,我就这样写:
List<Student> list = new ArrayList<Student>();
list = getAllStuInfo(queryRoom); //获取查询该寝室的学生的信息
studentTableModel.setStudent(list); //更新数据
mainFrame.add(scrollPane,BorderLayout.CENTER); //将JScrollPane重新添加到JFrame中
getAllStuInfo()是我写的一个用于获取<span style="font-family: Arial, Helvetica, sans-serif;">List集合列表的方法.然后去更新数据.最后把</span>
<span style="font-family: Arial, Helvetica, sans-serif;">JScrollPane再次添加到JFrame中,忽然发现竟然可行.数据得到了刷新,UI也进行了更新.</span>
总结:虽然是一种很笨很笨的方法,但是我在网上找了好久,找不到可以解决的方法,他们说的方法我都试过了,可还是不行.
希望大神看到,帮我想想有什么更好的办法可以解决.谢谢~