JTable com loop dando ConcurrentModificationException, botão que precisa clicar 50 vezes...
Boa tarde, pessoal!
Gostaria de pedir a ajuda de vocês, estou com alguns problemas no meu código.
Seguinte... Tem uma tabela no meu programa, a qual coloquei um loop para buscar os dados do MySQL e atualizar de segundo em segundo.
É a primeira vez que faço algo do tipo, e é a primeira vez que mexo com TimerTask, e estou obtendo alguns erros com isto.
O primeiro código que utilizei, foi para ficar verificando se tem algum cupom pendente para ser gerado.
O primeiro erro é o seguinte:
Exception in thread "Timer-1" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
at o.pdv.config.SAT$1.run(SAT.java:255)
at java.util.TimerThread.mainLoop(Unknown Source)
E, tem um segundo erro, que dá ao ficar atualizando a tabela para atualizar os pedidos recebidos do MySQL.
Erro:
Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at o.visual.pdv.Pedidos.atualizarTabela(Pedidos.java.74)
Que pertence ao seguinte código:
Também estou com um outro probleminha.. Nunca vi isto acontecer antes. As vezes, o usuário tem que clicar várias e várias vezes no botão para ele poder funcionar. Alguém já viu algo do tipo? Não dá erro nem nada... O botão parece que simplesmente não funciona as vezes. (PS: Todos os botões de um JFrame estão assim. Os demais botões dos demais JFrames estão normais.)
Se alguém conseguir me ajudar serei eternamente grato!
Obrigado, bom dia!
Gostaria de pedir a ajuda de vocês, estou com alguns problemas no meu código.
Seguinte... Tem uma tabela no meu programa, a qual coloquei um loop para buscar os dados do MySQL e atualizar de segundo em segundo.
É a primeira vez que faço algo do tipo, e é a primeira vez que mexo com TimerTask, e estou obtendo alguns erros com isto.
O primeiro código que utilizei, foi para ficar verificando se tem algum cupom pendente para ser gerado.
private static Timer loop = new Timer(); private static ArrayList<String> cuponsAFazer = new ArrayList<>();//ID Pedido => chaves a serem pegas private static ArrayList<String> cuponsACancelar = new ArrayList<>();//Chave do cupom private static void loop() { loop.scheduleAtFixedRate(new TimerTask() { public void run() { //Verificar cupons com ordem de geração if (cuponsAFazer != null && !cuponsAFazer.isEmpty()) { for (Object i : cuponsAFazer) {//O ERRO É EXATAMENTE NESTA LINHA buscarChave(Integer.valueOf(i.toString())); } } //Cancelar cupons for (String s : cuponsACancelar) { try { String cancelar = "ChaveNota=" + s; PrintWriter escrever = new PrintWriter(Main.config.getPastaMonitora() + "\\Cancela\" + s + ".tx2", "UTF-8"); escrever.print(cancelar); escrever.close(); remover.add("cancelar;" + s); } catch (FileNotFoundException | UnsupportedEncodingException ex) { } } for (String s : remover) {//Limpeza dos dados após finalização das tarefas. comando;variável if (s.split(";")[0].equalsIgnoreCase("cancelar")) { cuponsACancelar.remove(s.split(";")[1]);//ADICIONEI ISTO, POIS NÃO CONSIGO REMOVER DIRETAMENTE DENTRO DO FOR ACIMA, FOI A "GAMBIARRA" QUE ENCONTREI. } if (s.split(";")[0].equalsIgnoreCase("fazer")) { //cuponsAFazer.remove(s.split(";")[1]); } } remover.clear(); } }, 0, 1 * 1000); }
O primeiro erro é o seguinte:
Exception in thread "Timer-1" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
at o.pdv.config.SAT$1.run(SAT.java:255)
at java.util.TimerThread.mainLoop(Unknown Source)
E, tem um segundo erro, que dá ao ficar atualizando a tabela para atualizar os pedidos recebidos do MySQL.
Erro:
Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at o.visual.pdv.Pedidos.atualizarTabela(Pedidos.java.74)
Que pertence ao seguinte código:
public void atualizarTabela() { int[] selectedIndex = tabela.getSelectedRows(); DefaultTableModel dtm = (DefaultTableModel) tabela.getModel(); dtm.setRowCount(numPedidosNaLista); if (numPedidosNaLista == 0) { return; } int ultimaLinha = 0; ArrayList<resumoPedido> temp = pedidos; for (resumoPedido p : temp) {//O ERRO É EXATAMENTE NESTA LINHA. ANTES ESTAVA assim: for(resumoPedido p : pedidos), porém tentei mudar para isto, para fazer uma cópia temporária e acessar apenas a array temp, mas o erro permanece o mesmo if (p == null) { continue; } if (filtro.getNomeCliente() != null && !filtro.getNomeCliente().isEmpty()) { if (p.getNomeCliente() == null || p.getNomeCliente().isEmpty()) { continue; } if (!p.getNomeCliente().toLowerCase().startsWith(filtro.getNomeCliente().toLowerCase())) { continue; } } if (!filtro.temNomeCliente() && p.linhaDaTabela == -1) { continue; } if (ultimaLinha > resultadosPorPagina - 1) { continue; } if(dtm.getRowCount() < ultimaLinha){ continue; } String data = getData(p.dataAgendamento); String status = p.getStatus(); double valRestante = p.valTotal - p.valPago; dtm.setValueAt(p.IDPedido, ultimaLinha, 0); dtm.setValueAt(p.getIDCliente() == -13 ? "-" : p.getIDCliente(), ultimaLinha, 1); dtm.setValueAt(p.getNomeCliente(), ultimaLinha, 2); dtm.setValueAt(data, ultimaLinha, 3); dtm.setValueAt(p.valPago == 0 ? "" : Metodos.FN("#,###.##", p.valPago), ultimaLinha, 4); dtm.setValueAt(p.valTotal == 0 ? "" : Metodos.FN("#,###.##", p.valTotal), ultimaLinha, 5); dtm.setValueAt(valRestante <= 0 ? "" : Metodos.FN("#,###.##", valRestante), ultimaLinha, 6); dtm.setValueAt(p.IDEnredeço > 0 ? "Sim" : "", ultimaLinha, 7); dtm.setValueAt(status, ultimaLinha, 8); ultimaLinha++; } temp = null; System.gc(); if (ultimaLinha < (resultadosPorPagina)) { dtm.setRowCount(ultimaLinha); } }
Também estou com um outro probleminha.. Nunca vi isto acontecer antes. As vezes, o usuário tem que clicar várias e várias vezes no botão para ele poder funcionar. Alguém já viu algo do tipo? Não dá erro nem nada... O botão parece que simplesmente não funciona as vezes. (PS: Todos os botões de um JFrame estão assim. Os demais botões dos demais JFrames estão normais.)
Se alguém conseguir me ajudar serei eternamente grato!
Obrigado, bom dia!
Rafael
Curtidas 0