Estoy intentado desarrollar mi primer MVC, pero me he tropezado con un problema, que debido a mi gran desconocimiento teorico de java, ni he podido solucionar, ni he encontrado nada que me oriente de como hacerlo.
 
He reducido el codigo al minimo y con un jlabel/string, me funciona bien, pero el mismo sistema llevado a un jtable/tablemodel no me funciona. 
Este codigo si funciona: 
Código:
 /* 
 ---------------------------------------------------------------
	Clase principal
 ---------------------------------------------------------------
*/
import javax.swing.*;
public class prueba 
{
    public static void main(String[] args) {
        
        pruebaModelo      model      = new pruebaModelo();
        pruebaVista       view       = new pruebaVista(model);
        pruebaControlador controller = new pruebaControlador(model, view);
        
        view.setVisible(true);
    }
}
/* 
 ---------------------------------------------------------------
	Clase Modelo
 ---------------------------------------------------------------
*/
public class pruebaModelo 
{
	private String txtModelo;
	public pruebaModelo() {
		reset();
	}
	public void reset() 	{
		txtModelo = new String("Inicial");
	}	
	public void setValue(String value) {
   		txtModelo = new String(value);
    	}
	public String getValue() {
        	return txtModelo;
	}
} 
/* 
 ---------------------------------------------------------------
	Clase Vista
 ---------------------------------------------------------------
*/
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
class pruebaVista extends JFrame 
{
	JTextField texto = new JTextField(6);
	JLabel etiqueta =new JLabel("Nombre");
	JButton btnClear = new JButton("cambiar");
	private pruebaModelo m_model;
	
	pruebaVista(pruebaModelo model) 
	{
		m_model = model;
		this.getContentPane().setLayout (new FlowLayout());
		this.getContentPane().add (texto);
		this.getContentPane().add (etiqueta);
		this.getContentPane().add (btnClear);
		this.setTitle("Prueba MVC");
		this.setSize(600,400);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);		
	}
	
	void addClearListener(ActionListener cal) 
	{
        btnClear.addActionListener(cal);
	}
    
	String getUserInput() 
	{
        return texto.getText();
	}
    
	void setTexto(String newTexto) 
	{
        	//etiqueta.setText(newTexto);
        	etiqueta.setText(m_model.getValue());
	}  
}
/* 
 ---------------------------------------------------------------
	Clase Controlador
 ---------------------------------------------------------------
*/
import java.awt.event.*;
public class pruebaControlador 
{
    private pruebaModelo m_model;
    private pruebaVista  m_view;
    
    pruebaControlador(pruebaModelo model, pruebaVista view) {
        m_model = model;
        m_view  = view;
        view.addClearListener(new ClearListener());
    }
    class ClearListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
	    String userInput = "";
            userInput = m_view.getUserInput();
            m_model.setValue(userInput);
            m_view.setTexto(m_model.getValue());
        }
    }// end clase interna ClearListener
}
  El mismo sistema llevado a un jtable/tablemodel, no me funciona  
Código:
 /* 
 ---------------------------------------------------------------
	Clase principal
 ---------------------------------------------------------------
*/
import javax.swing.*;
public class prueba 
{
    public static void main(String[] args) {
        
        pruebaModelo      model      = new pruebaModelo();
        pruebaVista       view       = new pruebaVista(model);
        pruebaControlador controller = new pruebaControlador(model, view);
        
        view.setVisible(true);
    }
}
/* 
 ---------------------------------------------------------------
	Clase Modelo
 ---------------------------------------------------------------
*/
import javax.swing.table.DefaultTableModel;
public class pruebaModelo 
{
	private DefaultTableModel tmFichas;
	public pruebaModelo() {
		Object[][] data = {
            {"Juan", "carpintero","Alicante"},
            {"Marcos", "Abogado","Pontevedra"},
            {"Mercedes", "Doctora","Cuenca"}
        };
                String[] cols = {"Col1","Col2","Col3"};
		this.tmFichas = new DefaultTableModel(data,cols);
	}	
	public DefaultTableModel getModelo() {
                 return tmFichas;
    }
	
	public void setModelo() {		
		Object[][] data = {
            {"Rodriguez", "carpintero","Alicante"},
            {"Garcia", "Abogado","Pontevedra"},
            {"Perez", "Doctora","Cuenca"}
        };
        String[] cols = {"Col1","Col2","Col3"};
		tmFichas = new DefaultTableModel(data,cols);
	}	
} 
/* 
 ---------------------------------------------------------------
	Clase Vista
 ---------------------------------------------------------------
*/
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
class pruebaVista extends JFrame 
{
	JButton btnClear = new JButton("cambiar");
	JScrollPane spFichas;
	JTable jtbFichas;
	private pruebaModelo m_model;
	
	pruebaVista(pruebaModelo model) 
	{
		m_model = model;
		JTable jtbFichas = new JTable(m_model.getModelo());
		jtbFichas.setPreferredScrollableViewportSize(new Dimension(400, 200));
		JScrollPane spFichas = new JScrollPane(jtbFichas);
		this.getContentPane().setLayout (new FlowLayout());
		this.getContentPane().add (btnClear);
		this.getContentPane().add (spFichas);
		this.setTitle("Prueba MVC");
		this.setSize(600,400);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);		
	}
	
	void addClearListener(ActionListener cal) 
	{
        btnClear.addActionListener(cal);
    }
     
  	void setTabla() {
              jtbFichas.setModel(m_model.getModelo());
              // esta linea provoca el siguiente error
            //Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
           // at pruebaVista.setTabla(pruebaVista.java:35)
    }  
}
/* 
 ---------------------------------------------------------------
	Clase Controlador
 ---------------------------------------------------------------
*/
import java.awt.event.*;
public class pruebaControlador 
{
    private pruebaModelo m_model;
    private pruebaVista  m_view;
    
    pruebaControlador(pruebaModelo model, pruebaVista view) {
        m_model = model;
        m_view  = view;
        view.addClearListener(new ClearListener());
    }
    class ClearListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            m_model.setModelo();
	    m_view.setTabla();           			
        }
    }
}
  El error que me arroja el segundo ejemplo es
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at pruebaVista.setTabla(pruebaVista.java:35)  
Agradeceria cualquier ayuda para solucionar el problema para que el controlador pueda pasarle la vista al modelo, y la explicacion teorica o alguna orientacion para comprender porque con jlabel/string si funciona y no con un jtable/tablemodel si en ambos casos son objetos ¿donde esta la diferencia? 
Gracias por adelantado y perdon por el ladrillo