Foros del Web » Programación para mayores de 30 ;) » Java »

Problema diseño de MVC con jtable y tablemodel

Estas en el tema de Problema diseño de MVC con jtable y tablemodel en el foro de Java en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 04/04/2011, 16:55
 
Fecha de Ingreso: septiembre-2010
Ubicación: Malaga
Mensajes: 47
Antigüedad: 13 años, 7 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
  #2 (permalink)  
Antiguo 04/04/2011, 19:58
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Problema diseño de MVC con jtable y tablemodel

Hola,

Cita:
Iniciado por Oasis8 Ver Mensaje
... Agradeceria cualquier ayuda para solucionar el problema para que el controlador pueda pasarle la vista al modelo, ...
Este tipo de problemas a veces no resulta tan evidente, el problema es que estas definiendo una variable que oculta una propiedad de la clase. Y cuando quieres usar la propiedad de la clase, que no fue inicializada, tiene el valor null.
Código:
class pruebaVista extends JFrame 
{
    ...
	JTable jtbFichas;
    ...
	pruebaVista(pruebaModelo model) 
	{
	    ...
		JTable jtbFichas = new JTable(m_model.getModelo());
		...
	}
	...
 	void setTabla() {
        jtbFichas.setModel(m_model.getModelo()); // jtbFichas es null.
		...
   }  
}
Mientras que aquí solamente estas definiendo la propiedad,
Código:
class pruebaVista extends JFrame 
{
    ...
	JLabel etiqueta =new JLabel("Nombre");
	...
	pruebaVista(pruebaModelo model) 
	{
		...
		this.getContentPane().add (etiqueta);
		...
	}
	...	
	void setTexto(String newTexto) 
	{
        	//etiqueta.setText(newTexto);
        	etiqueta.setText(m_model.getValue());
	}  
}
Cita:
Iniciado por Oasis8 Ver Mensaje
... 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? ...
La diferencia está en que un programa no tiene errores de lógica y el otro sí.

Saludos,
  #3 (permalink)  
Antiguo 05/04/2011, 15:30
 
Fecha de Ingreso: septiembre-2010
Ubicación: Malaga
Mensajes: 47
Antigüedad: 13 años, 7 meses
Puntos: 1
Respuesta: Problema diseño de MVC con jtable y tablemodel

Gracias por tu tiempo y tu respuesta.

No se si me estoy peridiendo un poco,
¿ cuando te refieres a varialble es a jtbFichas y a clase no inicializada es a pruebaVista ?
Ya que esta ultima yo creia que la inicializaba en la clase principal.

¿ Como podria solucionarlo para que funcionara ?

¿ Es correcto el enfoque MVC que planteo o es erroneo desde la raiz?

Saludos
  #4 (permalink)  
Antiguo 05/04/2011, 20:13
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Problema diseño de MVC con jtable y tablemodel

Hola,

Cita:
Iniciado por HackmanC Ver Mensaje
[CODE]class pruebaVista extends JFrame
{
...
JTable jtbFichas;
...
pruebaVista(pruebaModelo model)
{
...
JTable jtbFichas = new JTable(m_model.getModelo());
...
}
...
No puede estar mas claro, si no puedes observar donde está el problema en esta sección de código, entonces no tengo idea como hiciste para escribir todo lo demás, la variable jtbFichas está definida dos veces, una a nivel de la clase y otra a nivel del método.
Cita:
Iniciado por Oasis8 Ver Mensaje
¿ ... y a clase no inicializada es a pruebaVista ?
Cita:
Iniciado por HackmanC Ver Mensaje
Y cuando quieres usar la propiedad de la clase, que no fue inicializada, tiene el valor null.
Por el contexto de la frase, cuando escribí que no fue inicializada, me refería al sujeto de la oración, que en ese caso es 'la propiedad de la clase'. La que no fue inicializada fue la propiedad de la clase.
Cita:
Iniciado por Oasis8 Ver Mensaje
¿ Como podria solucionarlo para que funcionara ?
Leyendo un libro sobre variables y su ámbito aplicado al lenguaje Java.
Cita:
Iniciado por Oasis8 Ver Mensaje
¿ Es correcto el enfoque MVC que planteo o es erroneo desde la raiz?
En mi opinión personal, (<-- esa es una coma) no está del todo mal, aunque no hay una especificación clara donde diga exactamente como implementar el patrón MVC, pero tampoco está del todo bien. (El sujeto en esta oración es tácito, estamos hablando del 'enfoque que planteaste del MVC')

Es decir, ¿que pasa si cambian los datos del modelo, desde dentro del modelo?, el modelo debe avisar a la vista o al controlador con un evento que debe actualizar los datos. Otra cosa es que las tres partes principales deben estar completamente desacopladas, y para eso se usan las interfaces.

¿Como hace el controlador para seleccionar el modelo, o vas a hacer un controlador por cada tipo de modelo y vista? ¿Entonces de que sirve el controlador?

Básicamente creo que está bien, pero lo hacen falta muchos conceptos.

Saludos,
  #5 (permalink)  
Antiguo 06/04/2011, 03:00
 
Fecha de Ingreso: septiembre-2010
Ubicación: Malaga
Mensajes: 47
Antigüedad: 13 años, 7 meses
Puntos: 1
Respuesta: Problema diseño de MVC con jtable y tablemodel

Hola

Perdona mi ofuscacion, dudaba si la subordinada hacia refencia al sujeto o al complemento. A veces se ven fantasmas por todos lados.
Quedaba muy claro que la propiedad/variable era Null, pero erroneamente elucubre que la causa era porque no estaba instanciada la clase.

Antes era mas facil, te daban 5 manuales y ahi estaba toda la informacion que se necesitaba, no habia mas. Ahora estamos inundados de informacion.
Seguire tu consejo y buscare informacion sobre el tema, a ver si soluciono este tema que creia que resolveria rapido y ya llevo varios dias atascado con el.

Con respecto al MVC buscaba exactamente lo que me comentas. Es el primer MVC en java que hago y a medida que vaya logrando funcionalidad, ire viendo nuevas necesidades, de las cuales tu ya me has adelando algunas.


Muchas gracias por tus apreciaciones y consejos
  #6 (permalink)  
Antiguo 06/04/2011, 05:22
 
Fecha de Ingreso: septiembre-2010
Ubicación: Malaga
Mensajes: 47
Antigüedad: 13 años, 7 meses
Puntos: 1
Respuesta: Problema diseño de MVC con jtable y tablemodel

Al fin consegui hacerlo funcionar, a pesar de que mas claro no me lo podias haber puesto.

El error estaba en que el constructor volvia a definir la variable de instancia
Código:
// Incorrecto
JTable jtbFichas = new JTable(m_model.getModelo());

// Correcto
jtbFichas = new JTable(m_model.getModelo());
Lo pongo por si hay alguien que pueda estar igual de ciego que yo.

Saludos
  #7 (permalink)  
Antiguo 06/04/2011, 21:55
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Problema diseño de MVC con jtable y tablemodel

Hola,

Cita:
Iniciado por Oasis8 Ver Mensaje
... Perdona mi ofuscacion, dudaba si la subordinada hacia refencia al sujeto o al complemento. A veces se ven fantasmas por todos lados. ...
Que agradable poder comunicarse correctamente con un colega, y te pido disculpas si en algún momento te pareció desagradable mi forma de contestar, y es por lo mismo de los fantasmas, así hay de preguntas y respuestas.

Cita:
Iniciado por Oasis8 Ver Mensaje
Al fin consegui hacerlo funcionar, a pesar de que mas claro no me lo podias haber puesto. ...
Para ser sincero no era fácil ver el error; pero creí conveniente dejar que investigaras más a simplemente darte la respuesta. Seguramente fue mucho mas provechoso para los dos de esta forma.

Muchos saludos,

Etiquetas: diseño, jtable, mvc
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:24.