Pergunta

Ao clicar em um botão, quero que as linhas selecionadas sejam invertidas (linhas não selecionadas devem ser selecionadas e linhas selecionadas devem ser não selecionadas).

Existe um método de construção em jtable para fazer isso?

Foi útil?

Solução

O JTABLE não parece ter uma maneira interna de fazer isso. Então, eu o implementei com o código a seguir. (Espero que isso seja útil para alguém que esteja enfrentando um problema semelhante.)

int[] selectedIndexs = jtable.getSelectedRows();
jtable.selectAll();

for (int i = 0; i < jtable.getRowCount(); i++) {
    for (int selectedIndex : selectedIndexs) {
        if (selectedIndex == i) {
            jtable.removeRowSelectionInterval(i, i);
            break;
        }
    }
}

Outras dicas

Para simplificar a solução de Sudar:

int[] selectedIndices = table.getSelectedRows();
table.selectAll();
for (int prevSel : selectedIndices) {
    table.removeRowSelectionInterval(prevSel, prevSel);
}

JTable não tem esse recurso

Não, você terá que implementar um corte ListSelectionListener

Um refinamento acima é atualizar a seleção usando o objeto de modelo de seleção, não o objeto de tabela. Quando você atualiza a seleção através da tabela, cada atualização dispara um evento de mudança de seleção e leva alguns segundos para atualizar uma tabela com apenas algumas centenas de linhas.

A maneira mais rápida de mesas com mais de algumas centenas de linhas é essa

/**
 * Invert selection in a JTable.
 *
 * @param table
 */
public static void invertSelection(JTable table) {
    ListSelectionModel mdl = table.getSelectionModel();
    int[] selected = table.getSelectedRows();
    mdl.setValueIsAdjusting(true);
    mdl.setSelectionInterval(0, table.getRowCount() - 1);
    for (int i : selected) {
        mdl.removeSelectionInterval(i, i);
    }
    mdl.setValueIsAdjusting(false);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top