[RESOLVIDO] Usando JOptionPane em um Do-While

34 respostas Resolvido
java
smatt

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: )

34 Respostas

staroski

Que erros?

smatt
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)
smatt

@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:

staroski

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

smatt

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)

smatt

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:

staroski

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.

smatt

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

smatt

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…

smatt

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…

staroski

Não entendi.

smatt

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

staroski

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.

smatt

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

smatt

@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?

staroski

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?

smatt

“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.

smatt

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á…

staroski

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.
smatt

Onde q tem esse ì?

c eh a instancia do controller, e cm eh a instancia do model.

Ai eh um fato. Vou renomeá-la.

Essa eh a camada Model das contas, já que estou cadastrando contas bancárias.

smatt

Renomeei o controller para “contasController” e o model para “contasModel”.

de “Insere” mudei para “contas”

staroski
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()));
smatt

Ahh sim, eu ja mudei meu codigo @staroski. Vou mandar ele aqui comentado da forma que ele está atualmente.

smatt

É porque ainda só fiz este método. Estou incrementando o meu código com mais funções. Mas ele diz q dessa forma, meu código não está certo. Ai queria saber a opiniao de outros programadores para eu ver se ele está falando que na verdade estou errado ou se apenas ele quer que eu faça da forma que ele pensa ser a melhor, sendo que nem sempre o que eu pensar vai ser da forma que ele pensaria. Vou postar aqui meu código comentado, daí creio que você conseguirá ter uma visão melhor do código até o momento.

smatt

Camada View:

package View;

import Model.ContasModel;
import Controller.CadastroContaController;
import java.util.ArrayList;
import java.util.List;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;


public class CadastroContaView extends javax.swing.JFrame {

    /**
     * Creates new form View
     */
    public CadastroContaView() {
        initComponents();
       
    }

    CadastroContaController contasController = new CadastroContaController(); // Instanciei o Controller aqui.

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jPanel3 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jTFConta = new javax.swing.JTextField();
        jTFNome = new javax.swing.JTextField();
        jLabel3 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jTFSaldo = new javax.swing.JTextField();
        jLabel4 = new javax.swing.JLabel();
        jTFLimite = new javax.swing.JTextField();
        botaoInserir = new javax.swing.JButton();
        botaoLimpar = new javax.swing.JButton();
        botaoVisualizar = new javax.swing.JButton();
        botaoSair = new javax.swing.JButton();

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 100, Short.MAX_VALUE)
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 100, Short.MAX_VALUE)
        );

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("CADASTRO");
        setMinimumSize(new java.awt.Dimension(328, 462));

        jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Cadastro de Contas", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 3, 18))); // NOI18N
        jPanel3.setPreferredSize(new java.awt.Dimension(300, 100));

        jLabel1.setText("Conta:");

        jTFConta.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jTFContaActionPerformed(evt);
            }
        });

        jTFNome.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jTFNomeActionPerformed(evt);
            }
        });

        jLabel3.setText("Titular:");

        jLabel2.setText("Saldo: ");

        jTFSaldo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jTFSaldoActionPerformed(evt);
            }
        });

        jLabel4.setText("Limite: ");

        botaoInserir.setText("INSERIR");
        botaoInserir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botaoInserirActionPerformed(evt);
            }
        });

        botaoLimpar.setText("LIMPAR");
        botaoLimpar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botaoLimparActionPerformed(evt);
            }
        });

        botaoVisualizar.setText("VISUALIZAR");
        botaoVisualizar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botaoVisualizarActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
        jPanel3.setLayout(jPanel3Layout);
        jPanel3Layout.setHorizontalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel3Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel3Layout.createSequentialGroup()
                        .addComponent(botaoInserir)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(botaoVisualizar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 29, Short.MAX_VALUE)
                        .addComponent(botaoLimpar))
                    .addGroup(jPanel3Layout.createSequentialGroup()
                        .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel1)
                            .addComponent(jTFConta, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jTFNome, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jTFSaldo, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel4)
                            .addComponent(jTFLimite, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel3)
                            .addComponent(jLabel2))
                        .addGap(0, 0, Short.MAX_VALUE)))
                .addContainerGap())
        );
        jPanel3Layout.setVerticalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel3Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jTFConta, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jLabel3)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jTFNome, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(12, 12, 12)
                .addComponent(jLabel2)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jTFSaldo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jLabel4)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jTFLimite, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(25, 25, 25)
                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(botaoInserir)
                    .addComponent(botaoLimpar)
                    .addComponent(botaoVisualizar))
                .addContainerGap(78, Short.MAX_VALUE))
        );

        botaoSair.setText("SAIR");
        botaoSair.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botaoSairActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            .addGroup(layout.createSequentialGroup()
                .addGap(131, 131, 131)
                .addComponent(botaoSair)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(20, 20, 20)
                .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, 362, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(botaoSair)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    private void botaoLimparActionPerformed(java.awt.event.ActionEvent evt) {                                            
        limpar(); // Método que limpa os campos.
    }                                           

    List<ContasModel> contas = new ArrayList<>(); // Criação do ArrayList (PS.: também renomeado, conforme suas instruções)

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

        ContasModel contasModel = new ContasModel(); // Criação de um objeto no Model.

        
        // A partir daqui, os setters das variáveis do objeto, pegando as informações que o usuário digitou:
        contasModel.setConta(Integer.parseInt(jTFConta.getText()));
        contasModel.setNome(jTFNome.getText());
        contasModel.setSaldo(Double.parseDouble(jTFSaldo.getText()));
        contasModel.setLimite(Double.parseDouble(jTFLimite.getText()));

        
        contas.add(contasModel); // Adicionando na ArrayList

        limpar(); // Chamando o método que limpa os campos, preparando-os para receber mais um cadastro de conta.

    }                                            
                                       
                                         
                                       
    private void botaoSairActionPerformed(java.awt.event.ActionEvent evt) {                                          
        System.exit(0); // Botão que fecha o programa.
    }                                         
    private void botaoVisualizarActionPerformed(java.awt.event.ActionEvent evt) {                                                
        contasController.mostraDados(contas); // Método no Controller, passando como argumento a lista, onde retorna para o usuário as informações das contas que ele cadastrou anteriormente.
    }                                               
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(CadastroContaView.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(CadastroContaView.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(CadastroContaView.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(CadastroContaView.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>
        //</editor-fold>
        //</editor-fold>
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new CadastroContaView().setVisible(true);

            }
        });

    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton botaoInserir;
    private javax.swing.JButton botaoLimpar;
    private javax.swing.JButton botaoSair;
    private javax.swing.JButton botaoVisualizar;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JTextField jTFConta;
    private javax.swing.JTextField jTFLimite;
    private javax.swing.JTextField jTFNome;
    private javax.swing.JTextField jTFSaldo;
    // End of variables declaration                   

    public void limpar() { // Método que limpa os campos.

        jTFConta.setText("");
        jTFNome.setText("");
        jTFSaldo.setText("");
        jTFLimite.setText("");
        jTFConta.requestFocus();

    }

    class Numeral extends PlainDocument { // Classe que faz os campos aceitarem apenas números.

        @Override
        public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
            int tamanho = (this.getLength() + str.length());

            if (tamanho <= 7) {

                super.insertString(offs, str.replaceAll("[aA-zZ]", ""), a);
            } else {
                super.insertString(offs, str.replaceAll("[aA0-zZ9]", ""), a);
            }
        }

    }

}

Camada de Controller:

package Controller;

import Model.ContasModel;

import java.util.List;
import javax.swing.JOptionPane;

public class CadastroContaController {

    ContasModel cm = new ContasModel(); // Instanciando o Model.

    public void mostraDados(List <ContasModel> a) { // Pegando o parâmetro daquela forma que você me passou uns dias atrás.

        for (ContasModel obj : a) { // Iterator da lista.

            //E aqui temos a tela que vai retornando as informações:
            
            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);

        }
    }
}

E a camada Model:

package Model;


public class ContasModel {

    private int conta;
    private String nome;
    private double saldo;
    private double limite;

    public int getConta() {
        return conta;
    }

    public void setConta(int codigo) {
        this.conta = codigo;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public double getSaldo() {
        return saldo;
    }

    public void setSaldo(double saldo) {
        this.saldo = saldo;
    }

    public double getLimite() {
        return limite;
    }

    public void setLimite(double limite) {
        this.limite = limite;

    }

}

Por enquanto essas ai sao as minhas classes, e o único método até o momento é o que mostra ao usuário as informações das contas cadastradas.

O que o programa precisa fazer:

  • cadastrar contas, sem limite de quantidade;
  • terminando os cadastros, fazer com que o usuário veja todas as contas que ele cadastrou;

E está executando perfeitamente, sem aqueles exceptions que estavam aparecendo.

Mas ele insiste em falar que está errado, principalmente essa minha criação de objeto a cada vez que o botão “Inserir” é pressionado (Veja o Action do botaoInserir). Mas criando um objeto fora do botão, a lista sempre fica com o ultimo dado que foi lançado pelo usuário e substitui os que foi lançado anteriormente por esse último. Caso vc possa e queira testar, tire a criação do objeto de dentro do Action do botãoInserir e instancie ele la junto com o Controller (lá no início do código da camada View), e debugue que vc vai entender o que está acontecendo com a lista. Mas veja ai e me dê um feedback por favor. :+1:

staroski

Qual a finalidade da sua classe controladora?
Ela serve só pra mostrar os dados recebidos por parâmetro?

O que seu professor passou exatamente?
O padrão MVC não diz nada sobre criar classes com sufixo Model e Controller tampouco separar em pacotes.
Esse padrão serve para separar a responsabilidade entre classes, basicamente o controlador deveria receber informações da tela, manipular o modelo e notificar a tela quando necessário.
A ideia dele é justamente evitar que a tela tenha conhecimento sobre as classes que compõe o model.

smatt

Até o momento, sim. Mas no caso, fazer as verificações se os dados são válidos, salvar em um banco de dados etc tudo seria feito pela controladora.

Eu preciso fazer um programa em MVC, que até o momento cadastre contas bancárias e retorne ao usuário as informações das contas que ele cadastrou. Mas com o tempo irei complementando o código, colocando mais funções nele.

No caso do sufixo, eu não achei nada que determine como deve ser o nome da classe, entao pus o sufixo para facilitar pra mim na hora de ficar trocando as abas. Com respeito aos pacotes, também não achei uma informação clara a respeito. Mas sinceramente, não sei a diferença entre deixar tudo no msm pacote ou separar em pacotes diferentes (Separei tbm por questão de organização, por que mais pra frente vou criar mais telas, como por exemplo de fazer depositos e saques, dai jogaria no pacote View por exemplo… mas não sei exatamente a função do package)

Concordo plenamente com oq vc disse, porém qnd pus a controladora para manipular o modelo, ele flw q estava errado, pq eu estava passando parâmetros para a controladora. Fiquei tipo “:roll_eyes::roll_eyes:” pq eh essa a função da controladora. Mas ele n aceitou dessa forma, e ai setei o model na View, pq ele pediu pra eu fazer dessa forma… vai entender… só sei q tbm acho q está errado, desde o princípio acho isso, mas infelizmente, se eu n fizer da forma q ele quer, ele não aceita ‘-’. Infelizmente tem gente ignorante que acha q so existe um jeito certo. Dai as outras pessoas ou fazem como ele faria ou a gente se ferra…

Isso mesmo. Mas conforme disse acima, tá meio tenso isso daí.

smatt

Porque na verdade, eu sou aprendiz numa empresa, e um programador que trabalha comigo que está me fazendo aprender java na marra para ajudar ele aqui (chamei ele de professor pra ficar resumido e não precisar explicar, mas foi preciso kkk). Mas to desconfiado que ele não sabe muito bem como funciona a arquitetura MVC kkkkkk

staroski

Situação delicada.
Nesta caso, sugiro que peça para ele lhe diagramar e explicar exatamente como quer que a coisa funcione.
Aí você pode mostrar pra ele se o raciocínio dele está OK ou não.

smatt

Demais, ai eu faço de acordo com o que pesquisei, e ele fala que está errado. Ai conserto até ele falar que está certo, mas ai fica esquisito o código. E se pra mim, que não sou experiente, acho estranho, imagina pra você que deve ter no minimo uns 5 anos de experiência neh?

smatt

Mas no caso em questão, em vez de eu mandar os dados para o model usando o Action do botãoInserir, o correto seria eu mandar os campos digitados como argumento para um método da controladora, onde o método pegaria este parâmetros e ai sim passaria para o modelo, certo?

No botão seria mais ou menos isso daqui:

contasController.recebeDados(Integer.parseInt(jTFConta.getText()), jTFNome.getText(), Double.parseDouble(jTFSaldo.getText()), Double.parseDouble(jTFLimite.getText()));

Enquanto na controladora teria o metodo recebeDados():

InserirModel modelo = new InserirModel ();
public void recebeDados (int conta, String nome, double saldo, double limite) {

modelo.setConta(conta);
modelo.setNome(nome);
modelo.setSaldo(saldo);
modelo.setLimite(limite);

}

Seria mais ou menos isso né? Ai a controladora estaria mandando os dados para o modelo e a view simplesmente passaria os getText para a controladora. Me corrija se minha linha de raciocinio estiver errada.

smatt

Ufa fiz dessa forma e ele aceitou kkkkk vai entender a cabeça dele… acho que ele me confundiu até e ai fiz novamente assim e ele aceitou.

staroski
Solucao aceita

O que está errado é você instanciar o objeto fora do método, tem que ser dentro, senão você só estará alterando os dados do objeto existente.

public void recebeDados (int conta, String nome, double saldo, double limite) {
    InserirModel modelo = new InserirModel (); // criar um novo objeto
    modelo.setConta(conta);
    modelo.setNome(nome);
    modelo.setSaldo(saldo);
    modelo.setLimite(limite);
}
smatt

@staroski , obrigado pela força! Com certeza voltarei aqui no fórum pedindo mais ajudas kkk mas obrigado por tudo q vc ja me ajudou aqui

Criado 23 de abril de 2019
Ultima resposta 26 de abr. de 2019
Respostas 34
Participantes 2