5

Jtable と dataModel に問題があります。私のテーブル モデルは AbstracttableModel を拡張し、データは Vector に格納されます。私は、1つ以上の行を削除すると思われる関数を持っています。私のjtableがselectionModeを次のように設定しているため、これらの行は必ずしも連続しているわけではありません。

jTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

行を削除する関数 (1 つずつ):

public void removeMessageRow(Integer p_idMessage) {
    Enumeration<MlMessage> alldatas = vData.elements();
    while (alldatas.hasMoreElements()) {
        MlMessage m = alldatas.nextElement();
        if (m.getIdMessage() == p_idMessage) {
            int idx = vData.indexOf(m);
            boolean result = vData.remove(m);
            // fireTableDataChanged();
            // fireTableRowsDeleted(idx, idx);
            fireTableStructureChanged();

            return;
        }
    }

関数を起動すると、問題なくループが実行されます。ステップバイステップ モードでは、vData オブジェクトが更新されていることがわかります。これを 1 回だけ実行すると、GUI に問題はありません。複数の行を選択すると問題が発生します。たとえば、テーブルで行番号 0 と番号 1 を選択し、removeMessageRow 関数を起動すると、最初の実行時に vDataObject が正しく更新されます (すべてのデータがシフトされ、このベクトルの最後の要素がによって null に設定されます)。に呼び出しますvData.remove(m). したがって、私の場合、2回目の実行では、検索するオブジェクトは位置0にあるはずですが、更新されていないため、vDataオブジェクトとして位置1にあると予想しています。誰かがそれについて考えを持っていますか? 私は多くのことを試しました... ものですが、すぐに実行できる人はいません。前もって助けてくれてありがとう、私のシェイクスピアの言葉でごめんなさい。

4

2 に答える 2

18

インデックスのコレクションを取得して削除するメソッドをモデルに追加し ( Set<Integer>、またはint[])、このコレクションを並べ替え、このコレクション内で後方に反復し、モデルのオブジェクトのリスト内の要素を削除します。

public void removeRows(int[] indices) {
    Arrays.sort(indices);
    for (int i = indices.length - 1; i >= 0; i--) {
        this.data.remove(indices[i]);
        fireTableRowsDeleted(indices[i], indices[i]);
    }
}
于 2011-11-28T11:46:07.453 に答える
0
int[] selectedRow = tblUsuarios.getSelectedRows();
int del=1;
for(int j=0; j<selectedRow.length; j++){
    modTabla.removeRow(selectedRow[j]);
    if(j<selectedRow.length-1){
        selectedRow[j+1] = selectedRow[j+1]-del;
        del = del+1;
    }
}

//modTabla = defaultTableModel
//tblUsuarios = jtable
于 2015-08-23T07:47:52.833 に答える