0

我想问关于列表选择监听器的问题。在我的应用程序中,我有 3 个 Jtable,假设第一个表是 Student 表,由学生信息填充,第二个是学期表,由对应学生的一些学期(第 1 学期到第 x)填充,最后一个表是结果表,由相应学期的结果填写。

我想要做的是,当我单击学生表中的一行时,学期表将更新它的数据,例如,它将由第 1 学期到第 6 学期填充。然后,当我单击学期表中的一行时,结果表将更新是数据。

我可以使用 listelectionlistener 和覆盖 valueChanged 方法从学生表到学期表。但是我应该如何为学期表到结果表做同样的事情?我被困在这个...

  • 我使用数据库将所有值检索到 jtable -

编辑:现在我使用 SwingWorker,但我有另一个问题:

  1. 当 UI 显示时,主表显示一行(这是真的)
  2. 当我尝试单击该行时,它没有单击,我的意思是通常你会在选定的行中获得背景,但我不会(错误->我的问题)
  3. 它还会在我的子表中抛出 NullPointerException
  4. 但是当我等待一段时间时,它突然又开始工作了......

我已经上传了我的示例代码,并在此处删除了不相关的代码http://dl.dropbox.com/u/67181952/mycode.java

子表中错误的第二个代码 http://dl.dropbox.com/u/67181952/spk.java

我希望我解释得很好,对不起我的英语不好。

谢谢你的帮助 :)

4

2 回答 2

1

您可以使用ListSelectionListener添加到您可以通过getSelectionModel()获得的选择模型。

使用表格模型维护表示的逻辑。一旦master表格中的选择发生更改,就会相应地更新表格的模型/模型details。作为数据更新的结果,模型将通知其视图(表)有关更改。并且视图将相应地刷新。

在如何使用表格中阅读有关模型的更多信息。

编辑:

由于您从数据库加载数据,请确保不要从事件调度线程 (EDT) 加载数据,以避免出现性能问题。查看SwingWorker以在专用线程上执行冗长的操作。阅读有关工作线程和 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();       
}
于 2012-05-17T16:37:01.420 回答
0

通常,我使用 MouseListener(mouseClick 事件)来处理 JTables。首先,当您在第一个表中单击时,将代表学生的对象保存在该行中,并告诉第二个表进行更新。第二个也会做同样的事情。对于每次单击,您都会保存学期对象并更新第三个表。当然,您可以使用 ListSelectionListener 执行相同的操作。我认为您已经在这样做了,但是您需要两个不同的事件侦听器。一个用于第一张桌子,另一个用于第二张桌子。

于 2012-05-17T15:54:19.570 回答