[RESOLVIDO] Usando JOptionPane em um Do-While

Bom dia, pessoal!

Estou precisando fazer uma estrutura de repetição, onde a resposta do JOptionPane repetiria o processo que um botão faz ao ser pressionado. No caso, estou criando um projeto onde insiro contas bancárias. O usuário preenche com o número da conta, titular, saldo inicial e limite. Ao pressionar o botão para inserir, retorna para ele uma confirmação, e logo após vem o JOptionPane, caso o usuário queira inserir mais uma conta. Sei que estou errando em algo, e talvez vocês saibam onde está. (Sou iniciante no Java).

Meu metodo do botão eh o seguinte:

private void jBInserirActionPerformed(java.awt.event.ActionEvent evt) {                                          

        List<InserirModel> Insere = new ArrayList<>();
        int confirma;
        
        do{      
                
        i.setConta(Integer.parseInt(jTFConta.getText())); // Estou usando estrutura MVC. Aqui estou setando o model...
        i.setNome(jTFNome.getText());
        i.setSaldo(Double.parseDouble(jTFSaldo.getText()));
        i.setLimite(Double.parseDouble(jTFLimite.getText()));

        Insere.add(i); // Preenchendo a arraylist...

        c.mostraDados(Insere); // No controller, retornando ao usuário a confirmação do que ele digitou...
        
          // E aqui vem o X da questão!

        confirma = JOptionPane.showOptionDialog (null, "Deseja adicionar mais alguma conta?", "Adicionar mais uma conta", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, "SIM");
        limpar();
        } while (confirma == JOptionPane.YES_OPTION);
    }    

Ele preenche uma vez, mas ai aparece muitos erros (e ainda não sei identificá-los). Eu debuguei e a partir da segunda vez, e ele não preenche outros elementos na arraylist. O que eu poderia fazer para sanar esse problema? (Caso queiram, eu posto aqui os erros que aparece :wink: )

Que erros?

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: ""
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:592)
	at java.lang.Integer.parseInt(Integer.java:615)
	at View.CadastroContaView.jBInserirActionPerformed(CadastroContaView.java:214)
	at View.CadastroContaView.access$300(CadastroContaView.java:21)
	at View.CadastroContaView$4.actionPerformed(CadastroContaView.java:109)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.AbstractButton.doClick(AbstractButton.java:376)
	at javax.swing.plaf.basic.BasicRootPaneUI$Actions.actionPerformed(BasicRootPaneUI.java:208)
	at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1663)
	at javax.swing.JComponent.processKeyBinding(JComponent.java:2882)
	at javax.swing.KeyboardManager.fireBinding(KeyboardManager.java:307)
	at javax.swing.KeyboardManager.fireKeyboardAction(KeyboardManager.java:250)
	at javax.swing.JComponent.processKeyBindingsForAllComponents(JComponent.java:2974)
	at javax.swing.JComponent.processKeyBindings(JComponent.java:2966)
	at javax.swing.JComponent.processKeyEvent(JComponent.java:2845)
	at java.awt.Component.processEvent(Component.java:6310)
	at java.awt.Container.processEvent(Container.java:2236)
	at java.awt.Component.dispatchEventImpl(Component.java:4889)
	at java.awt.Container.dispatchEventImpl(Container.java:2294)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1954)
	at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:806)
	at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1074)
	at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:945)
	at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:771)
	at java.awt.Component.dispatchEventImpl(Component.java:4760)
	at java.awt.Container.dispatchEventImpl(Container.java:2294)
	at java.awt.Window.dispatchEventImpl(Window.java:2746)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90)
	at java.awt.EventQueue$4.run(EventQueue.java:731)
	at java.awt.EventQueue$4.run(EventQueue.java:729)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

@staroski , visto que você já conhece o fundamento do meu programa, desde aquela mudança que fiz no List o programa estava funcionando perfeitamente. Mas ai to implementando aos poucos mais coisas. Ai agora quero disponibilizar que o usuário vá incrementando a ArrayList.

Mas pode ser também que eu esteja usando o tipo de JOptionPane errado né? :thinking:

Você está chamando o método Integer.parseInt passando um String vazio como parâmetro, não pode.

No caso, ele está alegando que eu não estou preenchendo a variável? :thinking: Pq o campo está sendo preenchido. (E já fiz uma forma de ele aceitar apenas números no campo que é int)

So uma pergunta: isso tudo ai são erros, ou é apenas um erro? :thinking:
A forma que vc falou me passou a ideia que isso tudo é apenas um erro. :thinking:

Você precisa aprender a ler o StackTrace do seu erro, ele traz toda a pilha de chamada de métodos desde o lançamento da exceção até o método inicial da Thread onde a exceção ocorreu.

Veja:

Essa exceção                    ->  Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: ""
foi lançada por este método     ->      at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
que foi chamado por este método ->      at java.lang.Integer.parseInt(Integer.java:592)
que foi chamado por este método ->      at java.lang.Integer.parseInt(Integer.java:615)
que foi chamado por este método ->      at View.CadastroContaView.jBInserirActionPerformed(CadastroContaView.java:214)

Foi você quem implementou o método java.lang.NumberFormatException.forInputString?
Não, então veja o próximo no StackTrace.

Foi você quem implementou o método java.lang.Integer.parseInt?
Não, então veja o próximo no StackTrace.

Foi você quem implementou o método java.lang.Integer.parseInt?
Não, então veja o próximo no StackTrace.

Foi você quem implementou o método View.CadastroContaView.jBInserirActionPerformed?
Sim!

Então é só você olhar o que você implementou no método jBInserirActionPerformed da classe View.CadastroContaView.

Mais especificamente na linha número 214 do arquivo CadastroContaView.java:214.

Nessa linha o método Integer.parseInt está recebendo um String vazio como parâmetro, você precisa tratar isso.

1 curtida

Certo, vou dar uma olhada. To até sem jeito por tomar tanto do seu tempo pra me ajudar kkk :sweat_smile::sweat_smile:

A linha 214 eh um outro método :thinking:

Eu criei para limpar os campos, e está fora dojBInserrirActionPerformed.
Tá associado com um botão “Limpar”.
O jBInserrirActionPerformed começa na linha 219 e a linha em que eu seto o model é a partir da linha 225 :thinking:

Não entendi o porque de ele notificar a linha 214, sendo q ela não tem nada a ver com o botão Inserir…

Ahhh deve ser pq eu mudei o código em algum momento aqui… Agora ele atualizou… o erro ta na 225 agora… só releve a minha ignorancia kkk vou quebrar mais a cabeça aqui kk mas com respeito a minha dúvida…

Não entendi.

Esses aqui. Isso tudo aqui que te passei é apenas um erro, ou são vários?

Isso é o StackTrace da exceção que foi lançada.
A primeira linha identifica em qual Thread a exceção ocorreu, qual a classe da exceção e sua mensagem.
A segunda linha é classe e método que lançaram essa exceção.
As linhas seguintes são os métodos que foram chamados.

Você analiza os StackTrace até identificar o método onde você esqueceu ou não tratou adequadamente uma exceção.

1 curtida

Ahh certo! Obrigado @staroski :wink: :wink:

@staroski me da um help aqui! Consegui fazer esse incremento de contas sem usar nenhuma estrutura de repetição, mas queria saber se vc acha q ficou meio “amador” o código, se ficou com gambiarra.

O método do botão:

  private void jBInserirActionPerformed(java.awt.event.ActionEvent evt) {                                         
            
            ContaModel cm = new ContaModel(); // Instanciei o objeto aqui, ai toda vez que acionado, o botão cria um novo objeto dentro do Model. (Apenas renomeei o Model)
                
            cm.setConta(Integer.parseInt(jTFConta.getText()));
            cm.setNome(jTFNome.getText());
            cm.setSaldo(Double.parseDouble(jTFSaldo.getText()));
            cm.setLimite(Double.parseDouble(jTFLimite.getText()));

            Insere.add(cm); // Insere na ArrayList

            limpar(); // Método que limpa os campos, preparando já para receber outros.

        } 

Acionando um outro botão que retorna os objetos, invoco o Controller:

public void mostraDados(List <ContaModel> a) {

        for (ContaModel obj : a) { // Aqui fiz um Iterator, bonitinho...

            JOptionPane.showMessageDialog(null, "Confirmação de dados: \n\nConta: " + obj.getConta() + "\nTitular: "
                    + obj.getNome() + "\nSaldo: R$" + obj.getSaldo() + "\nLimite: R$" + obj.getLimite(),
                    "CONFIRMADO!", JOptionPane.INFORMATION_MESSAGE);

        }
    }

O programa está executando sem erros. Antes, estava instanciando o objeto fora do botão, ai ele salvava várias vezes a mesma coisa dentro da ArrayList, e sempre substituia as outras linhas pelas ultimas informações que eu digitava. Instanciando dentro do botão, está salvando um por um, certinho. Porém, meu professor disse que está errado, mas baseado em tudo que pesquisei, está certo meu código. Qual sua opinião?

Acho que tens que usar nomes legíveis para suas variáveis e classes.
O que é e pra que serve a variável Insere (utilize nomes minúsculos)? “inserir” é um verbo, então deveria ser o nome de um método.
O que é um ContaModel? Um modelo de conta ou uma conta propriamente dita?

“Insere” eh o nome do ArrayList (esqueci de por ai pq o ArrayList ta fora do metodo botao).
ContaModel é a camada Model (já q o programa está em MVC). As variáveis tem o jTF antes do nome pq são jTextField.

Mas obrigado pelos conselhos. Mas gostaria de saber se existe gambiarra na minha lógica de programação. Relevando as nomenclaturas, mas focando na programaçao, o código tem gambiarras, ele está errado? Porque ele me falou que está, mas não vejo nenhuma gambiarra nesse código.

Fora que em programação, não existe apenas uma forma do que é certo :thinking:
Pode existir uma forma que seja a melhor, mas não apenas uma que seja a correta. Parece que ele quer que eu tenha a mente dele, e quer que eu faça da forma que ele faria, sei lá…

Não tenho argumentos pra opinar se está certo ou errado pois você só postou um método.
Mas esse método é confuso pois você acessa atributos com nomes nada legíveis:

  • você acessa um tal de ì que não sei o que é;
  • tem um tal de c que também não dá pra saber o que é;
  • tem uma lista chamada Insere sendo que uma lista não insere nada, as coisas é que são inseridas nela;
  • sua classe que representa uma conta você chamou de ContaModel, mesmo ela não sendo o modelo de nada.