Mvc swing duvida

Boa Tarde, senhores tenho que aprender mvc com swing, não achei nenhum exemplo de como implatar só informações teoricas,
então fiz um exemplo queria ver se tem como vocês da uma olhada nele e me ajudar corrigir, dar dicas no que está errado.
Esse exemplo ele só lista criar objeto do tipo usuario,e a unica regra é que pode criar o maximo 4 usuarios.
Só queria ver se o geito que eu estou fazendo está correto.

e se alguém tiver um bom exemplo, de implementação de mvc com swing e se poder me passar também.
agradeço

obrigado.

la vai

//irar modelar a classe usuario

package Modelo;

public class Usuario {

	private String nome;

	private int numeroDeJogador;

	public String getNome() {
		return nome;
	}

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

	public int getNumeroDeJogador() {
		return numeroDeJogador;
	}

	public void setNumeroDeJogador(int numeroDeJogador) {
		this.numeroDeJogador = numeroDeJogador;
	}

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return nome;
	}
}


//classe de controle 

package Controle;

import java.util.ArrayList;
import java.util.List;

import Modelo.Usuario;
import View.Menssagen;

public class Game {

	private static int quantidadeJogador;
	
	private Menssagen m;

	private List numeroDeJogador = new ArrayList<Usuario>();

	public static int getQuantidadeJogador() {
		return quantidadeJogador;
	}

	public static void setQuantidadeJogador(int quantidadeJogador) {
		quantidadeJogador = quantidadeJogador;
	}

	public void cadastraUsuario(Usuario jogador) {

		if (numeroMaximo()) {
			jogador.setNome("João");

			jogador.setNumeroDeJogador(1);
			quantidadeJogador++;
			System.out.println(quantidadeJogador);
			numeroDeJogador.add(jogador);
		}else {
			 m = new Menssagen();
			m.disparaMenssagen("Ldu1");
		}

	}

	boolean numeroMaximo() {

		if (getQuantidadeJogador() < 4) {
			return true;

		} else

			return false;

	}

}

//classe da view

package View;

import java.awt.BorderLayout;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

import Controle.Game;
import Modelo.Usuario;

public class FrameTeste implements ActionListener {
	JButton button;
	Usuario jogador;
	Game game;
	
	JTextField field;

	public static void main(String[] args) {

		FrameTeste frame = new FrameTeste();
		frame.MontarTela();

	}

	public void MontarTela() {
		// TODO Auto-generated constructor stub

		JFrame frame = new JFrame("teste");

		frame.setVisible(true);

		frame.setSize(300, 300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		button = new JButton("adiciona jogador");
		button.setSize(50, 50);
		frame.getContentPane().add(BorderLayout.SOUTH, button);
		
		JLabel label = new JLabel("Nome usuario");
		 field =  new JTextField();
		
		frame.getContentPane().add(BorderLayout.WEST,label);
		frame.getContentPane().add(BorderLayout.CENTER,field);
		button.addActionListener(this);
	
		
		
	}

	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		jogador = new Usuario();
		String nome=field.getText();
		jogador.setNome(nome);
		game = new Game();

		game.cadastraUsuario(jogador);

	}

}

Bem, existe alguns pequenos detalhes que devem ser corrigidos

1 - Na View não deve ter nenhuma regra de negócio, como por exemplo, implemente a interface ActionListerner na classe Controller e na classe controller deve ter um referência da View.
A View deve apenas possuir os componentes da GUI e nada mais. E A classe controller e que faz toda a regra de comunicação entre e View e a Model. E Model deve notifcar a view sobre qualquer mudança nos seus dados.

2 - Não há classe Controller em seu programa
Sua classe Game pelo que vi representa a Model e não à Controller, a classe Usuario não é faz parte da Model. A Model interrerage com sua classe Usuario.

3 - Não há classe Controller em seu sistema

4 - Na sua classe Game não vejo eventos. De uma olhada no padrão Observer. Este padrão e quem vai notificar sobre qualquer mudança ocorrida na Model.

Boa Noite, efeutei as alterações recomendada.
poderiam me dizer se está certo agora?


package Modelo;

import java.util.Observable;

public class Usuario extends Observable {

	private String nome;

	private int numeroDeJogador;

	public String getNome() {
		return nome;
	}
	
	

	public void setNome(String nome) {
		this.nome = nome;
		// altera o estado do modelo para modificado
		setChanged();
		// avisa as visões registradas no modelo que foi feito alteraçãp
		notifyObservers();
	}

	public int getNumeroDeJogador() {
		return numeroDeJogador;
	}

	public void setNumeroDeJogador(int numeroDeJogador) {
		this.numeroDeJogador = numeroDeJogador;
		setChanged();
		notifyObservers();
	}

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return nome;
	}
}


package Controle;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import Modelo.Usuario;
import View.*;

public class Game extends FrameTeste {

	private int quantidadeJogador;

	private Menssagen m;

	// private FrameTeste frame;
	private static List numeroDeJogador = new ArrayList<Usuario>();
	private Game game;
	private Usuario usuario;

	public Game(Usuario usuario) {
		// TODO Auto-generated constructor stub
		this.usuario = usuario;
		// this.frame = frame;

		addUpListener(new UpListener());
		// button.addActionListener(this);
	}

	public int getQuantidadeJogador() {
		return quantidadeJogador;
	}

	public void setQuantidadeJogador(int quantidadeJogador) {
		quantidadeJogador = quantidadeJogador;
	}

	public void cadastraUsuario(Usuario usuario) {

		if (numeroMaximo()) {
			usuario.setNome("João");

			usuario.setNumeroDeJogador(1);
			quantidadeJogador++;
			System.out.println(quantidadeJogador);
			numeroDeJogador.add(usuario);
		} else {
			m = new Menssagen();
			m.disparaMenssagen("Ldu1");
		}

	}

	boolean numeroMaximo() {

		if (getQuantidadeJogador() < 4) {
			return true;

		} else

			return false;

	}

	class UpListener implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			System.out.println("teste");
			String nome = field.getText();
			usuario.setNome(nome);
			cadastraUsuario(usuario);
		}
	}

}

package View;

import java.awt.BorderLayout;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Observable;
import java.util.Observer;

import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

import Controle.Game;
import Modelo.Usuario;

public class FrameTeste implements Observer {
	public JButton button;
	Usuario jogador;
	// Game game;

	public JTextField field;

	 
	public FrameTeste() {
		Usuario usuario = new Usuario();
		MontarTela(usuario);
		// TODO Auto-generated constructor stub
	}

	public void MontarTela(Usuario usuario) {
		// TODO Auto-generated constructor stub

		JFrame frame = new JFrame("teste");

		frame.setVisible(true);

		frame.setSize(300, 300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		usuario.addObserver(this);// registra o modelo que deseja observar

		JLabel label = new JLabel("Nome usuario");
		field = new JTextField();

		button = new JButton("adiciona jogador");
		button.setSize(50, 50);
		frame.getContentPane().add(BorderLayout.SOUTH, button);
		frame.getContentPane().add(BorderLayout.WEST, label);
		frame.getContentPane().add(BorderLayout.CENTER, field);

	}

	public void addUpListener(ActionListener e) {
		button.addActionListener(e);
	}

	@Override
	public void update(Observable o, Object arg) {
		// TODO Auto-generated method stub

	}

}


import Controle.Game;
import Modelo.Usuario;


public class Teste {
	
	public static void main(String[] args) {
		Usuario usuario = new Usuario();
		new Game(usuario);
		
	}

}

Vamos la ainda não esta certo.

1 - Outra dica não use a class java.util.Observable

2 - Sua classe usuario não faz parte do modelo MVC, você pode usar eventos também nessa classe mais em caso da classes como as do usuario vc pode usar a interafce PropertyChangeListener, segue um link com o tutorial so site da sum sobre o usa dessa interface
http://java.sun.com/docs/books/tutorial/javabeans/properties/index.html

[color=red]OBS: Eu não testei o código, qualquer coisa e so postar novamente[/color]

Veja o exemplo abaixo do MVC

Primeiro vamos criar nossos ouvidores de Eventos ou seja o listener, lembrando que essa é uma implementação simples.


    import java.util. EventListener;

    public interface GameListener extends EventListener{

            void changedValue(GameEvent evt);

    }

Agora vamos criar a classe responsavel por disparar os eventos


     import java.util.EventObject;
 
     public class GameEvent extends EventObject{
           
          private GameListener listener;
          
          public GameEvent(Game source, GameListener listener) {
               super(source);
               this.listener = listener;
          }

         public void changedValue(){
              listener.changedValue(this);
         }

     }

Muito importante sua classe Game é sua Model então não faça herança com a classe do Formulario, tire aquela referencias que você colocou sobre a View nesta classe, deixe como estava antes

[code]
import java.util.ArrayList;
import java.util.List;

import Modelo.Usuario;
import View.Menssagen;

public class Game {

private static int quantidadeJogador;   
   
private Menssagen m;   

private List numeroDeJogador = new ArrayList<Usuario>();   

private List<GameEvent> listener = new ArrayListener<GameEvent>()

//Registra os eventos  
public void addGameListener(GameListener listener){
     listener.add(new GameEvent(this, listener) );
}

//Remove os eventos registrados
public void removeGaneListener(GameListener listener){
     listener.remove(listener)
}

//Dispara os eventos registrados
protected void fireGameEvent(){
      for (GameEvent event : listener){
           event.changedValue();
     }
}

public static int getQuantidadeJogador() {   
    return quantidadeJogador;   
}   

public static void setQuantidadeJogador(int quantidadeJogador) {   
    quantidadeJogador = quantidadeJogador;   
    fireGameEvent(); //Aqui eu chamo o método que executa os eventos registrados quando o valor e alterado
}   

public void cadastraUsuario(Usuario jogador) {   

    if (numeroMaximo()) {   
        jogador.setNome("João");   

        jogador.setNumeroDeJogador(1);   
        quantidadeJogador++;   
        System.out.println(quantidadeJogador);   
        numeroDeJogador.add(jogador);   
    }else {   
         m = new Menssagen();   
        m.disparaMenssagen("Ldu1");   
    }   

}   

boolean numeroMaximo() {   

    if (getQuantidadeJogador() < 4) {   
        return true;   

    } else   

        return false;   

}   

} [/code]

Classe Controller
OBS: Você deve criar métodos de acesso aos componentes na View, por exemplo na classe controller você vai precisar de acessar o
JButton para registrar o comando de ação então vc tera um método getJButton() por exemplo na View

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 
import java.util.List; 

import Modelo.Usuario; 
import View.*; 

public class GameController{
 
      private FrameTeste frame;
      private Game game = new Game();
           
     public GameController(FrameTeste frame){
          this.frame = frame;
          
     }

     public void init(){
           game.addGameListener(new GameEventHandler());
           frame.getJButton().addActionListener(new UpListener());
           
     }

     private class GameEventHandler implements GameListener{

             void changedValue(GameEvent evt){
                  //Aqui voce coloca o codigo que vc quer que execute quando os dados da model é alterado
             }
     }
    
    private class UpListener implements ActionListener { 
             public void actionPerformed(ActionEvent e) { 
                     System.out.println("teste"); 
                     String nome = field.getText(); 
                     usuario.setNome(nome); 
                     cadastraUsuario(usuario); 
            } 
     } 
}

Executando o programa

public class Principal {     
    public static void main(String[] args) {    
        FrameTeste frame = new FrameTeste();   
        frame.MontarTela();    
        GameController controller = new GameController(frame);
        controller.init();
       frame.setVisible(true);
    }   

[color=red]Eu não testei o código, qualquer coisa e so postar novamente[/color]

obrigado pela ajuda, mais por que a classe usuario não faz parte do modelo? e se eu quiser usar um componente tipo Jtable, a tablemodel irá se relacionar com as classes de regra e relacionar com a view da jtable?
e o codigo agora, não está funcionando se não for abuso, tem como você fazer os ajuste nele?, pois está meio confuso para min.
você tem material bom sobre esses padrões usando java? pois só acho material teorico, queria um que mostrasse uma pequena implementação.
para conseguir entender bem.

obrigado.