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:
El mismo sistema llevado a un jtable/tablemodel, no me funciona/* --------------------------------------------------------------- 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 }
Código:
El error que me arroja el segundo ejemplo es/* --------------------------------------------------------------- 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(); } } }
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