klonder 14 Denunciar post Postado Junho 14, 2017 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
Don Benatti 28 Denunciar post Postado Junho 14, 2017 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
klonder 14 Denunciar post Postado Junho 15, 2017 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
Don Benatti 28 Denunciar post Postado Junho 15, 2017 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