1

JTable がソートされている場合、モデルで論理的に選択された行を保持する次のコードを取得するのに苦労しています。

並べ替えが適用されていない場合は、意図したとおりに機能します。

private void updateAccountTable() {
    accountsTable = guiFrame.getAccountsTable();

    // Preserve selected model row
    String accountNumber = "";
    int selectedRow = accountsTable.getSelectedRow();
    if(selectedRow >= 0){
        accountNumber = (String)accountsTable.getValueAt(selectedRow, 0);
    }

    // Preserve sort order
          // Keep eclipse happy.  better way??
    List <? extends SortKey> keys = accountsTable.getRowSorter().getSortKeys();

    // Update displayed accounts
    DefaultTableModel model = (DefaultTableModel) accountsTable.getModel();
    model.getDataVector().clear();

    Object[][] tableContents = accountList.getAccountsAsArray(true);
    model.setDataVector(tableContents, tableHeaders);
    model.fireTableDataChanged();

    // reset sort order
    accountsTable.getRowSorter().setSortKeys(keys);

    // If updated model contains previously selected account, reselect
    if (!accountNumber.equals("") && null != accountList.getAccount(accountNumber)){
        for (int row=0; row<accountsTable.getRowCount(); row++){
            String an = (String)accountsTable.getValueAt(row, 0);
            if (an.equalsIgnoreCase(accountNumber)){
                accountsTable.setRowSelectionInterval(row, row);
                break;
            }
        }
    }
    else {
        accountsTable.clearSelection();
    }
}

残念ながら、 setRowSelectionInterval() は、正しいビュー行番号で呼び出されたにもかかわらず、選択された行を期待どおりに更新しません。何もしないようです。

.....そう、

setRowSelectionInterval() が選択の更新に失敗するのはなぜですか?

4

2 に答える 2

2

row取得元はビュー座標ですが、getSelectedRow()モデル座標は介在する更新によって変更されています。関連するチュートリアルセクションからの引用:

列の並べ替え、フィルター処理、またはユーザー操作によって表示されたデータが再配置されていない限り、この区別は重要ではありません。

Sorting and Filteringの最後の方で説明されている変換方法を使用する必要があります。

ソーターを使用するときは、常にセル座標を変換することを忘れないでください。

于 2012-07-03T03:41:48.283 に答える