0

私は Java クラスを持っています。JTabbedPane がクリックされたときに DB から情報をロードするためのクエリ (EclipseLink を使用した JPA) を作成します。データは JTable にバインドされた TableModel にロードされます。選択したタブを取得するには、MouseEvent の MouseClicked を使用します。しかし、一部のテーブルの読み込みに失敗し、何もクリックされていないように感じますが、タブを移動して読み込みに失敗したタブに戻ると、最終的にデータが読み込まれることがあります。以下の私のコード:

private void jTabbedPane1MouseClicked(java.awt.event.MouseEvent evt) {  
  int selectTab = jTabbedPane1.getSelectedIndex();
  if (selectTab == 1) {
    bookValueTable.getColumnModel().getColumn(0).setMaxWidth(150);
    bookValueTable.getColumnModel().getColumn(1).setMaxWidth(150);
    if (!tab2Opened) { //this makes sure the data is not loaded multiple time....
        tab2Opened = true;
        Query q = em.createQuery("select e from EnterpriseInvestments e Where e.acctYear = :acctYear");
        q.setParameter("acctYear", acctYear);
        List<EnterpriseInvestments> resultList = q.getResultList();
        for(EnterpriseInvestments p: resultList){
          Object row[] = {p.getEnterprise().getRcNo(), p.getAcctYear(), p.getInvestmentItem(),
                nf.format(p.getInvestmentAmount())};
            shareCapitalModel.addRow(row);
        }
    }
    bookValueTable.setRowSorter(new TableRowSorter(shareCapitalModel));
}

問題の原因がどこにあるのかわからない: JPA、TabbedPane、または EventHandler!

4

2 に答える 2

3

リスナーに関する @JB のガイダンスに加えて、JPA クエリのレイテンシーがイベント ディスパッチ スレッド (EDT) をブロックしていると思われます。EDT でテーブル モデルを更新する必要がありますが、API に示されているように、のdoInBackground()メソッドでクエリを実行できます。SwingWorker

于 2012-07-22T14:11:09.130 に答える
2

私が正しく理解していれば、テーブルを含むタブが選択されたら、テーブルのコンテンツをロードしたいと思うでしょう。

まず第一に、これを行うために MouseListener を使用しないでください。低レベルのリスナーです。さらに、キーボードを使用してタブを切り替えることができました。タブ選択の変更を検出するには、ChangeListener をタブ付きペインに追加する必要があります。

もう 1 つすべきことは、リスナーから JPA コードを削除し、それを別のメソッド、さらには別のクラスに配置することです。データベースからデータを取得する方法を知ることは、GUI コードの仕事ではありません。これをデータ アクセス オブジェクトで実行し、このデータ アクセス オブジェクトを単体テストして、正しく機能するかどうかを確認します。それを知っている人は、GUIで使用してください。問題がある場合は、データ アクセス コードが機能することをテストしたので、GUI コードにあります。

デバッガーを使用し、最終的にステートメントをログに記録することも、問題の原因を診断するのに役立ちます。

于 2012-07-22T14:02:26.783 に答える