Estou tentando reescrever uma aplicação swing para o modelo MVC, então me deparei com algumas dúvidas, já que não encontrei nenhum exemplo prático de como dar inicio na codificação desse modelo. Eu tenho a noção básica de que devemos separar a visão do usuário do controle/atualização de dados e manipulação/alteração de dados.
A forma que encontrei pra conseguir fazer essa separação inicialmente e dar inicio na codificação da minha aplicação foi criando uma classe controller, e mandando sua instância pra dentro da minha primeira view com um JDesktopPane, e as views que eu chamasse a partir dali, por meio de botões, seriam “atributos” da minha controller criados em tempo de execução por meio de getters/setters.
Eu fiquei lendo meu código, e tenho quase certeza de que não seja a melhor forma de fazer.
Segue alguns trechos do código pra que possam entender o texto confuso.
Minha “Controller”:
package c;
import javax.swing.JFrame;
import v.Menu;
import v.Students;
public class Guard {
public static void main(String[] args) {
Guard guard = new Guard();
Menu frame = new Menu(guard);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setVisible(true);
}
public Students students;
public Students getStudents() {
return students;
}
public void setStudents(Students students) {
this.students = students;
}
}
Com base na resposta dessa pergunta, eu tenho outra, onde eu devo fazer a confirmação de dados inseridos, ver se não estão vazios e coisas do tipo?
É que eu tenho 80 linhas de confirmação campo a campo, que estão dentro de um método na minha View mas não sei pra onde posso mandar pra confirmar, eu teria que mandar componente por componente, a não ser que criasse uma lista ou algo assim.
A maneira mais simples é criar 4 pacotes. model, view, controller e DAO, caso tenha banco de dados.
Em seguida, crie uma classe em cada um dos pacotes.
Vou dar o exemplo de um cadastro de clientes:
Crie o beam na classe model: a classe ClienteModel com os atributos e getters e setters.
Crie a classe ClienteController: que vai receber uma instância de ClienteModel e passar para ClienteDAO.
Crie a classe ClienteDAO que vai receber um objeto ClienteModel da classe ClienteController.
A classe ClienteView só terá o listener para montar o objeto ClienteModel e passar para o ClienteController.
Fica tipo assim:
public class ClienteModel {
private String nome;
public String getNome() {
return this.nome;
}
public void settNome(String nome) {
this.nome = nome;
}
}
public class ClienteView extends JFrame {
public void actionPerformed(ActionEvent arg0) {
ClienteModel cliente = new ClienteModel();
ClienteController cc = new ClienteControler();
cliente.setNome("Fabio");
cc.cadastrar(cliente)
}
public class ClienteController {
public void cadastrar(Cliente cliente) {
ClienteDAO clienteDAO = new ClienteDAO();
clienteDAO.inserir(cliente);
}
}
public class ClienteDAO{
public void inserir(Cliente cliente) throws SQLException {
//Código que insere na base
}
}
Resumindo, é para evitar que uma classe “conheça” demais a outra e para manter o papel de cada uma.
A classe controller só recebe e repassa os dados. Ela é quem controla o fluxo.
Poxa, desculpa a demora pra responder mas valeu mesmo Fábio, essas linhas aí me ajudaram a notar alguns conceitos e me fizeram entender bem como funciona na prática, brigadão!