我想问一下列表选择监听器的问题。在我的申请中,我有3个Jtable,假设第一个表是学生表,由学生信息填写,第二个是学期表,由一些学期填写到通讯员学生(第1学期到第x学期),最后一个表是结果表格,由对应学期的结果填写。
我想要做的是当我点击学生表中的一行时,学期表将更新它的数据,例如,它将在第一学期到第6学期填充。然后,当我在学期表中点击一行时,结果表将更新它的数据。
我可以使用listselectionlistener从学生表到学期表,并覆盖valueChanged方法。但是我应该如何为学期表到结果表做同样的事情呢?我陷入了困境......
编辑:现在我使用了SwingWorker,但我有另一个问题:
我上传了示例代码,并在此处删除了不相关的代码http://dl.dropbox.com/u/67181952/mycode.java
子表中的错误的第二个代码 http://dl.dropbox.com/u/67181952/spk.java
我希望我解释得很好,抱歉我的英语不好。
感谢您的帮助:)
答案 0 :(得分:1)
您可以使用ListSelectionListener
添加到getSelectionModel()可以获得的选择模型中。
使用表格模型维护演示的逻辑。在master
表中选择后,相应地更新details
表的模型/模型。作为数据更新的结果,模型将通知其视图(表格)有关更改。并且视图将相应刷新。
详细了解How to Use Tables中的模型。
编辑:
由于您从数据库加载数据,请务必执行而不是事件调度线程(EDT)以避免性能问题。查看SwingWorker以在专用线程上执行冗长的操作。详细了解Worker Threads and SwingWorker。
编辑:代码上传后
您似乎误解了SwingWorker
规范。 execute()
方法没有阻塞,它会调度工作程序执行并立即返回。 UI更新应该在process()
或done()
方法中完成,这些方法由EDT上的工作人员调用。以下是您发布的代码中的一个函数的修订版本:
public void retrieveDetailTransaction(final String noTrans){
SwingWorker<List<TransactionDetail>, Void> worker =
new SwingWorker<List<TransactionDetail>, Void>() {
public List<TransactionDetail> doInBackground() {
List<TransactionDetail> listTransD = transDetailControl.select(noTrans);
return listTransD;
}
public void done() {
try {
listTransDetail = get();
transDetailModel.setListTransaction(listTransDetail);
transactionDetailTable.setModel(transDetailModel);
} catch (InterruptedException ex) {
ex.printStackTrace();
} catch (ExecutionException ex) {
ex.printStackTrace();
}
}
};
worker.execute();
}
答案 1 :(得分:0)
通常,我使用MouseListener(mouseClick事件)来处理JTable。首先,当您单击第一个表时,将表示该行中的学生的对象保存并告知第二个表进行更新。同样的事情将在第二个方面完成。对于每次单击,您保存学期对象并更新第三个表。当然,您可以使用ListSelectionListener执行相同的操作。我想你已经这样做了,但是你需要两个不同的事件监听器。一个用于第一个,另一个用于第二个表。