Невозможно получить правильную строку из JTable после ее сортировки (Swing)

У меня есть AbstractTableModel, например:

public class TableModelClienteFornecedor extends AbstractTableModel {

    private List<ClienteFornecedorDTO> linhas;
    private String[] colunas = new String[]{"Nome", "Conta"};

    public TableModelClienteFornecedor() {
        linhas = new ArrayList<>();
    }

    @Override
    public int getRowCount() {
        return linhas.size();
    }

    @Override
    public int getColumnCount() {
        return colunas.length;
    }

    @Override
    public String getColumnName(int column) {
        return colunas[column];
    }

     @Override
    public Class getColumnClass(int column) {
         return (getValueAt(0, column).getClass());        
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        ClienteFornecedorDTO cf = linhas.get(rowIndex);
        switch (columnIndex) {
            case 0:
                return cf.getNome();

            case 1:
                return cf.getConta();

            default:
                throw new IndexOutOfBoundsException("Coluna incorreta");
        }
    }

    public void clear(JTable table) {
        table.setRowSorter(null);
        int indiceAntigo = this.getRowCount();
        linhas.clear();
        int indiceNovo = this.getRowCount();
        this.fireTableRowsDeleted(indiceAntigo, indiceNovo);
    }

    public boolean isEmpty() {
        return linhas.isEmpty();
    }

    public void add(ClienteFornecedorDTO cf) {
        linhas.add(cf);
        int index = this.getRowCount();
        fireTableRowsInserted(index, index);
    }

    public void addList(List<ClienteFornecedorDTO> list, JTable table) {
        int tamanhoAntigo = this.getRowCount();
        linhas.addAll(list);
        int tamanhoNovo = this.getRowCount() - 1;
        this.fireTableRowsInserted(tamanhoAntigo, tamanhoNovo);      
        table.setAutoCreateRowSorter(true);        
    }

    public ClienteFornecedorDTO get(int i) {
        return linhas.get(i);
    }
}

И код ниже работает нормально, чтобы заполнить мою Jtable данными:

private void realizarBusca(String nome) {

    IContaDAO dao = new ContaDAO();
    boolean isFornecedor = radioFornecedor.isSelected();
    List<ClienteFornecedorDTO> retorno =
         dao.retornaContaClienteFornecedor(isFornecedor, nome);
    tableModelClienteFornecedor.clear();
    tableModelClienteFornecedor.addList(retorno, tableClienteFornecedor);
    tableClienteFornecedor.updateUI();
}

У меня все работает нормально, и когда я визуально сортирую свою Jtable, все тоже в порядке, проблема в том, что когда я нажимаю на определенную строку из моей Jtable после ее сортировки, строка не обновляется.

Кто-нибудь может помочь мне с этим? Я был бы признателен, потому что я занимаюсь этим со вчерашнего дня и до сих пор не смог найти способ решить эту проблему.


person Rafael Paz    schedule 03.01.2014    source источник
comment
Не используйте метод updateUI(). Никогда нет причин для этого.   -  person camickr    schedule 03.01.2014


Ответы (1)


Посмотрите на методы convertRowIndexToModel() и convertRowIndexToView() в JTable.

Когда таблица отсортирована, индексы строк в представлении больше не совпадают с индексами в модели, и вы должны использовать вышеуказанные методы для преобразования из индекса в представление и наоборот.

Например, если вы вызовете JTable.getSelectedRow(), вы получите индекс представления выбранной строки. Вам нужно будет преобразовать его в индекс модели (используя convertRowIndexToModel()), чтобы иметь возможность получить выбранный объект из списка в вашей модели.

person JB Nizet    schedule 03.01.2014
comment
Эй JB, спасибо за ваш ответ. Я попробовал это, но индекс все равно не изменился: int index = tabelaClienteFornecedor.getSelectedRow(); ClienteFornecedorDTO dto = (ClienteFornecedorDTO) tabelaClienteFornecedor.getModel().getValueAt(tableaClienteFornecedor.convertRowIndexToView(index), 0); - person Rafael Paz; 03.01.2014
comment
Вы должны использовать convertRowIndexToModel(), а не convertRowIndexToView(). - person JB Nizet; 03.01.2014