1

4 つの列を持つ jTable があります。最初の列にはメンバーのコード、2 番目の列には入会日、3 番目の列には有効期限が表示されます。有効期限がシステム日付から 10 日を超えている場合は、列から行を削除する必要があります。

私は次のようなコードを書いています:

    public void expire(){

    try{
    DefaultTableModel model = (DefaultTableModel) empTbl.getModel();
    int col=2;
    int rows = empTbl.getRowCount();
    for(int row=0; row<=rows; row++){

     SimpleDateFormat formater = new SimpleDateFormat("dd-MM-yyyy");
     Calendar currentDate = Calendar.getInstance();
     String d = formater.format(currentDate.getTime());
     Date haatdinPisorTarikh = (Date)formater.parse(d);   

     String expdate = (String)empTbl.getValueAt(row, col);
     Date expire=(Date)formater.parse(expdate);
     Calendar expireDate = Calendar.getInstance();
     expireDate.add(Calendar.DATE, -10);

     if(expireDate.after(haatdinPisorTarikh)){
     model.removeRow(row);
     }
     }

      }catch(ParseException ex){}
       }

この方法は機能しません。私はどこで間違いをしていますか? 助けてください...

ここに画像の説明を入力

4

2 に答える 2

2

最も重要な問題はあなたのループにあります(明らかに)...

int rows = empTbl.getRowCount(); // <-- Get row count, good...
for(int row=0; row<=rows; row++){
    // Make your calculations...
    if(expireDate.after(haatdinPisorTarikh)){
        model.removeRow(row);
        // Uh-oh, the row count has changed
        // Also, the row index is no longer valid!!
    }
}

あなたがすべきことは、ある種の行識別子をに配置しjava.util.List(行インデックスを使用しないでください。同じ問題が発生します)、削除する各行をそれに追加し、スキャンが完了した後にモデルの「削除」リストを反復処理し、識別子で各行のインデックスを検索して削除します。

それ以外の場合は、テーブルフィルターを使用するだけで、かなり簡単になると思います...

于 2013-01-22T08:34:53.767 に答える
2

最後から始めるための整理ができます。

int rows = empTbl.getRowCount(); 
for(int row=rows-1; row>=0; row--) {
    //delete from model won't harm your row indexes.
}
于 2013-01-22T09:08:59.737 に答える