Conservar la fila del modelo seleccionado en JTable ordenado a través de la actualización del modelo

Tengo dificultades para obtener el siguiente código para preservar la fila seleccionada lógicamente en el modelo si JTable se ha ordenado.

Funciona según lo previsto cuando no se aplica la clasificación.

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();
    }
}

Desafortunadamente, setRowSelectionInterval () no actualiza la fila seleccionada como se esperaba, a pesar de ser llamada con el número de fila de vista correcto. Parece que no hace nada.

.....Entonces,

¿Por qué setRowSelectionInterval () no puede actualizar la selección o qué me he perdido?

Respuesta 1

Lo rowobtenido de las coordenadas getSelectedRow()está a la vista , mientras que las actualizaciones del modelo han cambiado las coordenadas del modelo . Citando de la sección de tutoría relevante :

Esta distinción no importa a menos que los datos vistos se hayan reorganizado mediante la clasificación, el filtrado o la manipulación de columnas por parte del usuario.

Deberá utilizar los métodos de conversión descritos cerca del final de la Clasificación y el Filtrado , que sugiere:

Cuando use un clasificador, recuerde siempre traducir las coordenadas de las celdas.

Respuesta: 2

Cuando uso JUnitParams, puedo pasar una matriz de objetos donde cada elemento se usará para ejecutar una prueba. ¿Hay alguna forma de agregar un nombre o identificación a cada uno de estos? Entonces, cuando ejecuto estas pruebas JUnit, ...

Estoy construyendo un proyecto multiproceso en Java, tengo entidades y paquetes DAO para envolver las tablas de la base de datos y manipularlas. Tengo un paquete de procesamiento que contiene Runnables. La forma en que tengo ...

Tengo un archivo de registro que se actualiza constantemente con nuevas líneas de datos. Necesito obtener nuevos datos agregados en Java tan pronto como estén escritos. Por ahora mi solución es: public static void readNonStop (String ...

Me gustaría aplicar el mismo efecto que shell.setAlpha (240), sin embargo, estuve navegando por Internet durante un par de horas y todavía no encontré la solución. Motivo: decidí mejorar la apariencia visual ...