如何在3表中使用ListSelectionListener与数据库

时间:2012-05-17 15:48:29

标签: java database swing jtable listselectionlistener

我想问一下列表选择监听器的问题。在我的申请中,我有3个Jtable,假设第一个表是学生表,由学生信息填写,第二个是学期表,由一些学期填写到通讯员学生(第1学期到第x学期),最后一个表是结果表格,由对应学期的结果填写。

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

我可以使用listselectionlistener从学生表到学期表,并覆盖valueChanged方法。但是我应该如何为学期表到结果表做同样的事情呢?我陷入了困境......

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

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

  1. 当显示UI时,主表显示一行(这是真的)
  2. 当我尝试点击该行时,它没有点击,我的意思是通常你会在选定的行中获得背景,但不是我(错误 - >我的问题)
  3. 它还会在我的子表
  4. 中抛出NullPointerException
  5. 但是当我等了一会儿,它又突然又起作用了......
  6. 我上传了示例代码,并在此处删除了不相关的代码http://dl.dropbox.com/u/67181952/mycode.java

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

    我希望我解释得很好,抱歉我的英语不好。

    感谢您的帮助:)

2 个答案:

答案 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执行相同的操作。我想你已经这样做了,但是你需要两个不同的事件监听器。一个用于第一个,另一个用于第二个表。