Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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?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)
>
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);
}
*/
>
1 hora atrás, klonder disse:
for (int i = 0; i<ol_OUTRASDESPESAS.size(); i++) {
Você pode usar forEach nesse caso