今天下午遇到一个问题.当我从数据库从查询到数据想及时把数据更新到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>


总结:虽然是一种很笨很笨的方法,但是我在网上找了好久,找不到可以解决的方法,他们说的方法我都试过了,可还是不行.


希望大神看到,帮我想想有什么更好的办法可以解决.谢谢~