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.
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.
Renomeei o controller para “contasController” e o model para “contasModel”.
de “Insere” mudei para “contas”
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()));
Ahh sim, eu ja mudei meu codigo @staroski. Vou mandar ele aqui comentado da forma que ele está atualmente.
É 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.
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:
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. 
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.
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 “
” 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í.
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
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.
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?
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.
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.
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);
}
@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