JTable在JScrollPane中刷新数据的问题



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

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


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

要在JTable显示后端数据,你可以采取以下步骤: 1. 创建一个TableModel类来管理数据TableModel是JTable用于获取和管理数据的接口。你可以自定义一个TableModel类,继承AbstractTableModel,并实现必要的方法,如获取行数、列数、单元格值等。 2. 在TableModel定义一个数据结构来存储后端数据。可以使用集合类(如List)来存储数据对象,或者直接使用二维数组。 3. 实现TableModel的方法,以便JTable可以从TableModel获取数据并在前端显示。至少需要实现以下几个方法: - `getRowCount()`:返回数据的行数。 - `getColumnCount()`:返回数据的列数。 - `getValueAt(int row, int column)`:返回指定行列的单元格值。 4. 创建一个JTable实例,并将自定义的TableModel对象作为参数传入JTable的构造函数。这样,JTable将使用TableModel来管理数据。 5. 将JTable添加到前端的用户界面,例如将其放置在一个JScrollPane以支持滚动。 6. 将后端数据填充到TableModel,以便在JTable显示。你可以从后端获取数据,并将其存储在TableModel的数据结构。 7. 当后端数据发生变化时,更新TableModel数据,并通知JTable进行刷新。可以通过调用`fireTableDataChanged()`方法来触发刷新。 通过以上步骤,你可以实现将后端数据显示在JTable。当后端数据发生变化时,你只需要更新TableModel数据,并通知JTable进行刷新即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值