Dúvidas em relação ao modelo MVC

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;
    }
}

ActionPerformed do botão da minha view

guard.setStudents(new Students());
desktopPane.add(guard.getStudents());
guard.getStudents().setVisible(true);

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.

Meu caro, bom dia.

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.

Espero que tenha ajudado.

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!