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