2012-05-17 35 views
0

我想問一個關於列表選擇監聽器的問題。在我的應用程序中,我有3個Jtable,可以說第一個表是學生表,由學生信息填充,第二個表是學期表,由一些學期填寫給代表學生(第1至第x學期),最後一個表爲結果表格,填寫記者學期的成績。如何在3個表中使用ListSelectionListener與數據庫

我想要做的是當我單擊學生表中的一行時,學期表會更新它的數據,例如,它將填寫學期1到6。然後,當我在學期表中單擊一行時,結果表會更新它的數據。

我可以使用listselectionlistener和覆蓋valueChanged方法從學生表到學期表。但我應該如何做相同的學期表結果表?我被陷在這個...

  • 我使用的數據庫檢索所有值的JTable -

編輯:我現在用的SwingWorker,但我有一個問題:

  1. 當用戶界面顯示時,主表顯示一行(這是真的)
  2. 當我嘗試點擊該行,它不點擊,我的意思是通常你會得到一個選定的行中的背景,但不與我(錯 - >我的問題)
  3. 它還拋出NullPointerException我的子表
  4. 但是,當我等待了一會兒,它突然又工作...

我上傳我的示例代碼,並在這裏刪除無關的代碼http://dl.dropbox.com/u/67181952/mycode.java

錯誤的子表 http://dl.dropbox.com/u/67181952/spk.java

第二個代碼,我希望我對我的英語不好解釋好,對不起。

感謝所有幫助:)

回答

1

您可以使用ListSelectionListener添加到您可以通過getSelectionModel()獲得的選擇型號。

使用表模型維護演示邏輯。在master表中選擇表格後,相應更改details表的更新型號/型號。作爲數據更新的結果,模型將通知其視圖(表格)有關更改。視圖將相應刷新。

How to Use Tables中瞭解更多的模型。

編輯:

由於加載從數據庫中的數據一定要做到這一點不是從事件分派線程(EDT),以避免出現性能問題。查看SwingWorker在專用線程上執行冗長的操作。閱讀更多關於Worker Threads and SwingWorker

編輯:下面的代碼上傳

看來你誤解SwingWorker規格。​​方法沒有阻塞,它會安排工作人員執行並立即返回。 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();  
} 
+0

我終於可以使它selectlistener,如上所述,但我的應用程序凍結,沒有響應時,我點擊了4/5時間。怎麼了?這是我的overrided的valueChanged 如果(transactionTable.getSelectionModel()== e.getSource()){ // 一些代碼 } 否則,如果(transactionDetailTable.getSelectionModel()== e.getSource()){ //一些代碼 } – bangandi

+0

@bangandi你是從數據庫或文件加載數據? – mKorbel

+0

@mKorbel過濾是一個偉大而簡單的解決方案,如果你掌握了所有的數據。 – tenorsax

0

通常情況下,我使用的MouseListener(鼠標點擊事件)與JTable中工作。首先,當您單擊第一個表格時,將表示學生的對象保存在該行中,並告訴第二個表格進行更新。第二個也會做同樣的事情。對於每次點擊,您保存學期對象並更新第三個表格。當然,你可以使用ListSelectionListener做同樣的事情。我認爲你已經這樣做了,但是你需要兩個不同的事件監聽器。第一個和第二個表的一個。

+0

我以前從來沒有使用的MouseListener,但感謝你的幫助,我想試試... – bangandi

相關問題