0

ここに問題があります。3 つのコンボ ボックス、テキスト フィールド、いくつかのボタン、および JTable で構成される JDialog ボックスがあります。JTable 情報は、テキスト フィールドとコンボ ボックスに基づいてフィルター処理されるため、たとえば、すべてのデータから始まり、ユーザーが決定した任意の文字列値で始まるデータのみに縮小されます。

ただし、値が正しくフィルタリングされている間に、JTable (行のない空白部分) をクリックすると、削除された行が、クリックするまで見えなかったように表示されます。ほぼ試しましたすべて:フィルターがクリックされるたびにテーブルを再作成しようとしました(うまくいかなかった悪いハック)、すべての再描画、再検証、firechangedメソッドを呼び出しました、確認するためにダイアログを最初から書き直しました私は愚かな間違いを犯したことはありません (もし私が間違いを犯したとしても、少なくともそれを見つけることはできませんでした)。私が試していない唯一の修正は、swing ワーカーを使用することですが、それは私のフィルタリングが少し複雑すぎて、何がどこにあり、swing ワーカーを正しく拡張する方法を理解できなかったためです。GUI は netbeans (bleh) によって生成され、私の他の十数個ほどの JDialogs で問題なく動作しました (実際には完全に)。フィルタリングを行う方法は次のとおりです。誰かがそれを助けることができれば、大歓迎です。

 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

        nameFilter = "task1";
        javax.swing.table.DefaultTableModel dm = (javax.swing.table.DefaultTableModel)jTable1.getModel();


       tempParameters = parameters;
       String currentString;
       int rowNumber = 0;
       while (dm.getRowCount()>rowNumber){
           currentString = (String)(jTable1.getValueAt(rowNumber,1));
           if(!nameFilter.equalsIgnoreCase(currentString.substring(0,nameFilter.length()))){
               dm.removeRow(rowNumber);
               parameters--;
           }
           else rowNumber++;
       }
       parameters = numOfRows;
}

更新、以下のコメントからフィルターも実装しました。正しいデータをフィルターで除外しましたが、まったく同じ問題がありました。将来的には、おそらくこのフィルター機能を使用する予定です。

別の更新、このチャンク以外のすべてを削除した後でもコードはまだ失敗しています。ここで行っているのは、単純な行の削除呼び出しを行っていることです。これが少し役立つことを願っています。

4

3 に答える 3

0

行を削除してクリアするのではなく、フィルタリングするたびに新しいモデルを作成しようとしましたか? 新しいモデルを作成し、関連する行を新しいモデルにコピーし、テーブルに新しいモデルを設定します。実際には必要ありませんが、簡単な修正になる可能性があります。

また、equalsIgnoreCase を使用してそれらを比較しているときに、なぜ 2 つの文字列に対して toLowerCase を呼び出しているのか疑問に思う必要があります。

于 2011-06-23T16:35:20.093 に答える
0

いくつかの観察:

  • フィルターが行の文字列コンテンツよりも大きい場合、部分文字列呼び出しがスローされます
  • dm.removerow を呼び出すと、一連の tablerowsdeleted イベントが生成されます。
  • モデルから行数を要求していますが、テーブルから値を取得しています (少し一貫性がありません。モデルが別のモデルにラップされている場合、別の行で動作している可能性があります)。 jtable1.getvalueat の代わりに、 dm.getvalueat.

    イベントが発生すると、JTable で再描画イベントと再検証イベントが発生することがわかります。これらは、EDT でキューに入れられるときに互いに踏みにじられる可能性があります。

    私がお勧めするのは、新しいデータモデルを作成し、保持したい行を追加してから、それを jTable1.setModel(newDm); に再割り当てすることです。

    また、イベントリスナーにいる間に他の誰かがモデルを変更していないかどうかにも注意してください。

    お役に立てれば

  • 于 2011-06-23T18:15:38.533 に答える
    0

    このメソッドが EDT から呼び出される限り、スレッドの問題はないと思います。使ってみて

    SwingUtilties.isEventDispatchThread()
    

    確かめる。

    DefaultTableModel の API を見ると、更新が JTable に送信され、それ自体が再描画されるので、それは問題ではないと思います。

    論理的な問題だと思います。ロジックを別々のメソッドに抽出できれば、期待どおりにモデルが更新されているかどうかをテストおよび検証するのが簡単になります。

    于 2011-06-23T16:58:42.770 に答える