0

リスト選択リスナーについて質問したいのですが。私のアプリケーションでは、3つのJtableがあります。たとえば、最初のテーブルは学生の情報が入力されたStudentテーブル、2番目のテーブルは対応する学生の学期が入力された学期のテーブル(学期1からx)で、最後のテーブルは結果です。対応する学期の結果で埋められた表。

私がやりたいのは、学生テーブルの行をクリックすると、学期テーブルがそのデータを更新します。たとえば、1学期から6学期までにデータが入力されます。次に、学期テーブルの行をクリックすると、結果テーブルが更新されます。それはデータです。

listselectionlistenerとオーバーライドvalueChangedメソッドを使用して、学生テーブルから学期テーブルにそれを行うことができます。しかし、学期の表から結果の表まで同じようにするにはどうすればよいですか?私はこれで立ち往生しています...

  • 私はデータベースを使用してすべての値をjtableに取得します-

編集済み:SwingWorkerを使用しましたが、別の問題があります:

  1. UIが表示されているとき、マスターテーブルには行が表示されます(これはtrueです)
  2. その行をクリックしようとすると、クリックされません。つまり、通常、選択した行に背景が表示されますが、私には表示されません(間違った->私の問題)
  3. また、子テーブルでNullPointerExceptionをスローします
  4. しかし、しばらく待つと、突然再び動作します...

サンプルコードをアップロードし、ここで無関係のコードを削除しましたhttp://dl.dropbox.com/u/67181952/mycode.java

子テーブルのエラーの2番目のコード http://dl.dropbox.com/u/67181952/spk.java

英語が下手でごめんなさい。

助けてくれてありがとう:)

4

2 に答える 2

1

getSelectionModel()ListSelectionListenerで取得できる選択モデルに追加を使用できます。

テーブルモデルを使用して、プレゼンテーションのロジックを維持します。テーブルでの選択がmaster変更されたら、それに応じてモデル/detailsテーブルのモデルを更新します。データの更新の結果として、モデルは変更についてビュー(テーブル)に通知します。それに応じてビューが更新されます。

モデルの詳細については、「テーブルの使用方法」を参照してください

編集:

データベースからデータをロードするため、パフォーマンスの問題を回避するために、イベントディスパッチスレッド(EDT)からではなく必ずロードしてください。SwingWorkerを調べて、専用スレッドで長い操作を実行します。ワーカースレッドとSwingWorkerの詳細をご覧ください。

編集:次のコードアップロード

SwingWorkerスペックを誤解しているようです。execute()メソッドはブロックされていません。ワーカーの実行をスケジュールし、すぐに戻ります。UIの更新は、EDTのワーカーによって呼び出されるメソッドprocess()またはメソッドで実行する必要があります。done()以下は、投稿したコードの関数の1つの改訂版です。

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イベント)を使用してJTableを操作します。まず、最初のテーブルをクリックすると、その行に学生を表すオブジェクトが保存され、2番目のテーブルに更新を指示します。同じことが2番目にも行われます。クリックするたびに、学期オブジェクトを保存し、3番目のテーブルを更新します。もちろん、ListSelectionListenerを使用して同じことを行うことができます。あなたはすでにこれを行っていると思いますが、2つの異なるイベントリスナーが必要です。1つは最初のテーブル用で、もう1つは2番目のテーブル用です。

于 2012-05-17T15:54:19.570 に答える