Ver Mensaje Individual
  #1 (permalink)  
Antiguo 04/04/2011, 16:55
Oasis8
 
Fecha de Ingreso: septiembre-2010
Ubicación: Malaga
Mensajes: 47
Antigüedad: 13 años, 8 meses
Puntos: 1
Problema diseño de MVC con jtable y tablemodel

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