Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

klonder

TreeTableView - Excluir várias linhas

Recommended Posts

Olá a todos!

Pesquisei em vários locais, inclusive aqui no fórum, e não encontrei nenhuma resposta sobre a seguinte situação:

Tenho um TreeTableView que carrega vários itens vindos do Banco de Dados. De acordo com a característica de cada item, eles são divididos em nós previamente especificados (são apenas estes nós pré-estabelecidos).

Exemplo dos Nós: Materiais, Medicamentos, Taxas, Aluguéis...

 

Em um determinado momento, preciso imprimir essa TreeTableView, excluindo algumas linhas que são desnecessárias. Quanto à impressão está tudo ok.

Mas, para ganhar tempo, eu preciso excluir várias linhas de uma vez dessa TreeTableView, apertando o Shift e clicando/selecionando todas as linhas que deverão ser excluídas.

 

Antes de postar o método que encontrei, vou detalhar como estou fazendo:

Quando abro a TreeTableView, os dados originados do Banco de Dados são salvos em um ObservableList<itens> ol_OUTRASDESPESAS. Esse ObservableList é então processado e a TreeTableView é criada com cada item em seu nó específico. Preciso então imprimir essa TreeTableView, mas para isso, em alguns casos, preciso excluir várias linhas ao mesmo tempo.

 

O que estou fazendo:

Crio uma ObservableList transitória (ol_TEMP) com todas as linhas que estão selecionadas. Criei um laço for que percorre todos os itens da ol_OUTRASDESPESAS e um laço interno que percorre todos os itens da ol_TEMP. Dentro desses laços verifico se existe um ID dentro de ol_TEMP que seja igual ao id de ol_OUTRASDESPESAS. Se os IDs forem iguais, eu excluo o item de ol_OUTRASDESPESAS.

 

private void excluirItem_OutrasDespesas() {
	ObservableList<TreeItem<objOutrasDespesas>> ol_T = FXCollections.observableArrayList(ttvOutrasDespesas.getSelectionModel().getSelectedItems());
	//Percorrendo todos os itens do ol_OUTRASDESPESAS. Se o item atual estiver na lista de excluídos, excluir.
    for (int j = 0; j<ol_T.size(); j++) {
                for (int i = 0; i<ol_OUTRASDESPESAS.size(); i++) {
                    if (Objects.equals(ol_OUTRASDESPESAS.get(i).getId(), ol_T.get(j).getValue().getId())) {
                        //System.out.println("Removendo: "+ol_OUTRASDESPESAS.get(i).getItem());
                        ol_OUTRASDESPESAS.remove(i);
                    }
                }
            }
    estruturaBasica();
}

estrutura() é apenas uma chamada ao método para reconstruir a TreeTableView.

 

Essa foi a maneira que encontrei para excluir os itens selecionados, porém não creio que seja a melhor. Sei que em Java existe o método removeAll, porém não consegui aplicar nesse caso.

A minha dúvida é a seguinte: Existe outra opção melhor do que essa? Consigo evitar todos esses loops necessários para excluir todos os itens selecionados?

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, klonder disse:

ol_OUTRASDESPESAS.remove(i);

 

Isso ai vai lançar uma exceção (ConcurrentModificationException)

for (int i = 0; i<ol_OUTRASDESPESAS.size(); i++) {

Você pode usar forEach nesse caso

List<String> exemplos = new ArrayList<>();

exemplos.add("...");

for (String exemplo : exemplos) {
    System.out.println(exemplo);
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz uma correção no código e esse problema foi corrigido (já corrigi no post acima). Ocorria em algumas situações dependendo da posição do ID. Agora o código acima está funcionando perfeitamente! Só que está funcionando do jeito que está...

Eu gostaria de saber se seria possível fazer de outra forma, como:

 

ol_OUTRASDESPESAS.RemoveAll(ol_T)

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
18 minutos atrás, klonder disse:

Eu gostaria de saber se seria possível fazer de outra forma

Para resolver o problema de ConcurrentModificationException,  entre uma das formas, você poderia salvar os valores para remoção em outra lista:

java.util.List<Integer> outrasDespesasParaRemover = new java.util.ArrayList<>();

e agora ao invés de usar "ol_OUTRASDESPESAS.remove(i);", você salva apenas a posição na lista outrasDespesasParaRemover:

if (Objects.equals(ol_OUTRASDESPESAS.get(i).getId(), ol_T.get(j).getValue().getId())) {
    outrasDespesasParaRemover.add(i);
}

Depois faz a remoção separadamente

// Java 8
if (outrasDespesasParaRemover.size() > 0) {
    outrasDespesasParaRemover.forEach(ol_OUTRASDESPESAS::remove);
}

/*
Caso não esteja usando Java 8:

for (int i : outrasDespesasParaRemover) {
    ol_OUTRASDESPESAS.remove(i);
}
*/

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.