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

paso de un DefaultTableModel a otro

Estas en el tema de paso de un DefaultTableModel a otro en el foro de Java en Foros del Web. Hola comunidad, tengo el siguiente problema. He leido en este foro y en internet, y los distintos ejemplos no me han ayudado con el tema ...
  #1 (permalink)  
Antiguo 10/11/2014, 08:14
 
Fecha de Ingreso: octubre-2010
Mensajes: 154
Antigüedad: 13 años, 6 meses
Puntos: 5
paso de un DefaultTableModel a otro

Hola comunidad, tengo el siguiente problema.
He leido en este foro y en internet, y los distintos ejemplos no me han ayudado con el tema puntual que tengo..

Tengo el siguiente esquema:
tengo un JFrame en el cual es para tickar las compras (supermercado), y como suele pasar que viene un cliente, pasa algunos articulos, los pasa, y se va a buscar otros...

mientras tanto para seguir cobrando al siguiente, lo que hago es "guardar", la lista de articulos comprados en un boton (con su objeto de DefaulTableModel asociado).
Puedo guardar hasta 10 ticket a la vez.

paso cod de lo que tengo:
Código Declaracion: :
Ver original
  1. public DefaultTableModel model;
  2. public static DefaultTableModel mM1, mM2, mM3, mM4, mM5, mM6, mM7, mM8, mM9, mM10;
  3. private List<DefaultTableModel> listModel;
  4. private JTable tabla;
  5. private JButton btnM1, btnM2, btnM3, btnM4, btnM5, btnM6, btnM7, btnM8, btnM9, btnM10;

Código metodos:
Ver original
  1. listModel = new ArrayList<DefaultTableModel>();
  2.  
  3. /*la declaracion de todos los botones es la misma*/
  4. btnM1 = new JButton();     
  5.         btnM1.addActionListener(new ActionListener() {
  6.             public void actionPerformed(ActionEvent arg0) {
  7.                 botonTicket(btnM1, mM1); //evento para asignar los modelos
  8.             }
  9.         });
  10.         btnM1.setFont(new Font("Tahoma", Font.PLAIN, 30));
  11.         btnM1.setBounds(744, 20, 80, 50);
  12.         contentPane.add(btnM1);

Si el boton tiene o no asignado un ticket, le asigno el texto de: "Mn", donde "n" es la cantidad de ticket ya guardados en lista.
Código Java:
Ver original
  1. public void botonTicket(JButton boton, DefaultTableModel modN){
  2.         DefaultTableModel auxModel, aux;
  3.         try {
  4.             auxModel = (DefaultTableModel) tabla.getModel();
  5.             boolean celdaVacia = (auxModel.getValueAt(0, 0).equals(null) || auxModel.getValueAt(0, 0).equals(""));
  6.            
  7.                 listModel.add(auxModel);    //agrego el modelo al boton
  8.                
  9.                 if (boton.getText().length() > 0)
  10.                 {
  11.                     initTabla(modN); //esta en el boton
  12.                     modN = auxModel;
  13.                     listModel.remove(modN); //quito el modelo del boton                                
  14.                 }else
  15.                 {
  16.                    
  17.                     modelos(auxModel, modN);
  18.                     initTabla(null);
  19.                 }
  20.                 boton.setText("M"+listModel.size());           
  21.            
  22.         } catch (Exception e) {
  23.             //quito modN de la lista y borro el boton
  24.             if(boton.getText().length() > 0){
  25.                 listModel.remove(modN); //quito el modelo del boton                                
  26.                 initTabla(modN); //esta en el boton                    
  27.                 boton.setText("");
  28.             }          
  29.            
  30.             e.printStackTrace();
  31.            
  32.         }
  33.        
  34.     }
  35.  
  36.     public void modelos(DefaultTableModel modViejo, DefaultTableModel modNuevo) {
  37.        for (int i=0;i<modViejo.getRowCount(); i++) {
  38.             Object fila [] = new Object [modViejo.getColumnCount()];
  39.             for (int j=0; j<modViejo.getColumnCount(); j++){
  40.                 fila[j] = modViejo.getValueAt(i,j);
  41.             }
  42.             modNuevo.addRow(fila);
  43.         }        
  44.     }
  45.  
  46. public void initTabla(TableModel mod){
  47.         if (mod == null){
  48.             model = new DefaultTableModel(
  49.                     new Object[][] {
  50.                             {null, null, null, null, null, null, null},
  51.                             {null, null, null, null, null, null, null},
  52.                             {null, null, null, null, null, null, null},
  53.                             {null, null, null, null, null, null, null},
  54.                         },
  55.                         new String[] {
  56.                             "C\u00F3digo", "Detalle", "Cantidad", "Imp.Interno", "Pr.Unit.", "Total", "SN"
  57.                         }
  58.                     ) {
  59.                         Class[] columnTypes = new Class[] {
  60.                             String.class, String.class, String.class, String.class, String.class, String.class, String.class
  61.                         };
  62.                         public Class getColumnClass(int columnIndex) {
  63.                             return columnTypes[columnIndex];
  64.                         }
  65.                     };
  66.             tabla.setModel(model);
  67.            
  68.             tabla.getColumnModel().getColumn(0).setMinWidth(50);
  69.             tabla.getColumnModel().getColumn(1).setPreferredWidth(100);
  70.             tabla.getColumnModel().getColumn(1).setMinWidth(60);
  71.             tabla.getColumnModel().getColumn(3).setMinWidth(30);
  72.             tabla.getColumnModel().getColumn(4).setMinWidth(30);
  73.         }else{
  74.             int fila = mod.getRowCount();
  75.             int col = mod.getColumnCount();
  76.            
  77.             for (int x = 0; x < fila; x++){
  78.                 for (int y = 0; y < col; y++){
  79.                    
  80.                     model.setValueAt(mod.getValueAt(x, y), x, y );
  81.                 }
  82.             }
  83. //          model = md;
  84.             tabla.setModel(model);
  85.         }  
  86.        
  87.     }

el problema es el siguiente, cuando hace click en un boton, "creo" asigna bien lo que esta en la tabla (articulos cargados para tickar), al modelo del boton, pero...

Cuando hace click en el boton, para "volcar" lo que se encuentra en ese modelo correspondiente, no lo esta asignado al modelo de la tabla. No me lo carga o muestra.

Ya no tengo idea que probar porque hace dias que estoy dando vuelta con este tema.

Puede ser que no me este guardando el model de la tabla en el modelo correspondiente del boton (el que paso por parametro)?

Cualquier ayuda sera bienvenida.
Si hay alguna forma de pasar el codigo de la clase, me avisan porque tiene unas mil lineas.

Saludos.
  #2 (permalink)  
Antiguo 11/11/2014, 12:24
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: paso de un DefaultTableModel a otro

Hola,

Posiblemente,

Cita:
Iniciado por lucho248 Ver Mensaje
[HIGHLIGHT="Java"]
public void botonTicket(JButton boton, DefaultTableModel modN){
...
modN = auxModel;
...
Puede ser que no me este guardando el model de la tabla en el modelo correspondiente del boton (el que paso por parametro)?
...
Posiblemente no se está guardando, los parámetros en el lenguaje Java se pasan por valor en todos los casos. En la línea donde dice modN = auxModel no estás modificando la variable estática mM1, como seguramente piensas.

Un par de detalles adicionales que posiblemente te sean de utilidad, el lenguaje Java es mucho mas extenso y no lo estás usando como se debe. Por eso estás haciendo miles de líneas para algo que seguramente tomaría mucho menos.

Es un lenguaje orientado a objetos, con referencias y garbage collector, posiblemente estás muy acostumbrado a usar lenguaje C, Pascal, Visual Basic 6 y su DataGrid u otros, pero por ejemplo, el TableModel es un objeto.

¿Para que copias todo el contenido de un TableModel a otro, celda por celda, si es tan simple guardar todo el table model y asignarselo completo de nuevo?

Al principio pensé que la variable listModel te servía para algo así, después me di cuenta que la variable no es útil en todo (lo visible) del programa.

Código Java:
Ver original
  1. TableModel MyOldTableModel = Table.getModel();
  2. Table.setModel(MyOtherTableModel);
  3. Table.setModel(MyOldTableModel);

Saludos,
  #3 (permalink)  
Antiguo 11/11/2014, 15:06
 
Fecha de Ingreso: octubre-2010
Mensajes: 154
Antigüedad: 13 años, 6 meses
Puntos: 5
Respuesta: paso de un DefaultTableModel a otro

Hola HackmanC, lo copio al DefaultTableModel porque necesito guardar temporalmente lo tickado o leido por el colector de codigo de barra de un cliente.
Es una tienda chica, entoces se da seguido que viene un cliente, pasa algunos articulos, y vuelve a buscar otros articulos, entonces se guarda por un rato (5min, 10min, 25min), se sigue facturando al siguiente cliente en la fila, hasta que vuelve el anterior cliente con lo que fue a buscar. Se recupera lo ya leido, y se continúa con el ticket hasta cerralo.

Entonces solo quiero guardar la instancia de DefaultTableModel un momento, empezar otro, guardarlo o no si es necesario, si se repite la situacion, y recuperarlo cuando el cliente vuelve. Se entiende?

Link de imagen
si miras, donde estan los botones don los textos "M1", "M2", etc. es ahi donde voy guardando los ticket temporalmente.
  #4 (permalink)  
Antiguo 11/11/2014, 15:18
 
Fecha de Ingreso: octubre-2010
Mensajes: 154
Antigüedad: 13 años, 6 meses
Puntos: 5
Respuesta: paso de un DefaultTableModel a otro

lo solucione momentaneamente de la siguiente manera:

Código Declaracion::
Ver original
  1. public DefaultTableModel model;
  2.     public DefaultTableModel mM1, mM2, mM3, mM4, mM5, mM6, mM7, mM8, mM9, mM10;
  3.     public int ticket;
  4.     private List<String> listTicket;


Código Metodos:
Ver original
  1. public void botonTicket(JButton boton, DefaultTableModel modN){
  2.         DefaultTableModel auxModel, aux = null;
  3.         aux = modelosBotones(aux);
  4.         try {
  5.             auxModel = (DefaultTableModel) tabla.getModel();
  6.             boolean celdaVaciaTabla = (auxModel.getValueAt(0, 0).equals("") || auxModel.getValueAt(0, 0).equals(null));
  7.             boolean celdaVaciaModelo;
  8.             if (modN != null){
  9.                 celdaVaciaModelo = (modN.getValueAt(0, 0).equals("") || modN.getValueAt(0, 0).equals(null));           
  10.             }else{
  11.                 celdaVaciaModelo = false;
  12.             }
  13.            
  14.             if (celdaVaciaTabla && (boton.getText().length() > 1))
  15.             {  
  16.                 modelos(modN, auxModel);
  17.                 tabla.setModel(auxModel);
  18.                 modN = new DefaultTableModel();
  19.                 modN = modelosBotones(modN);
  20.                
  21.                 int intBoton = Integer.parseInt(boton.getText().substring(1, boton.getText().length()));
  22.                 String strBoton = boton.getText();
  23.                 boton.setText("");
  24.                
  25.                 ticket = intBoton-1; //resto un ticket menos que el que se quito
  26.                 listTicket.remove(strBoton);
  27.                
  28.             }else{                                         
  29.                     /** si los dos estan vacios o los dos tienen ticket, que no intercambie nada y no incremente el ticket*/
  30.                     if(!celdaVaciaTabla && celdaVaciaModelo ){
  31.                         modelos(auxModel, modN);
  32.                         initTabla(null);
  33.                                                
  34.                         boolean esta;                      
  35.                         do{
  36.                             ticket++;
  37.                             esta = listTicket.contains("M"+ticket);                        
  38.                         }while(esta);                      
  39.                         if(!esta){
  40.                             listTicket.add("M"+ticket);
  41.                             boton.setText("M"+ticket);
  42.                         }
  43.                     }              
  44.             }      
  45.            
  46.         } catch (Exception e) {
  47.             e.printStackTrace();           
  48.         }      
  49.     }
  50.    
  51.     /** Intercambio los DefaultTableModel con este metodo
  52.      * @param DefaultTableModel modViejo: el modelo con datos
  53.      * @param DefaultTableModel modNuevo: el modelo en blanco, donde se copiaran los datos.
  54.      * */
  55.     public void modelos(DefaultTableModel modViejo, DefaultTableModel modNuevo) {
  56.         int filas = modViejo.getRowCount();
  57.         int col = modViejo.getColumnCount();
  58.         int i = 0, j = 0;
  59.         boolean BFilas = false;
  60.        while (i<filas && !BFilas) {
  61.            
  62.             if (modViejo.getValueAt(i,j) == null || modViejo.getValueAt(i,j) == "")
  63.                 BFilas = true;
  64.             else{
  65.                 while (j < col){
  66.                    
  67.                     modNuevo.setValueAt(modViejo.getValueAt(i,j), i,j);
  68.                     modViejo.setValueAt("", i,j);
  69.                     j++;
  70.                 }              
  71.                 i++;
  72.                 j = 0;
  73.             }          
  74.         }
  75.    }

con estas modificaciones logre que haga lo que estoy buscando.
Si alguien me puede indicar como mejorarlo, sera bien venido.
Saludos.
  #5 (permalink)  
Antiguo 11/11/2014, 15:51
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: paso de un DefaultTableModel a otro

Hola,

Cita:
Iniciado por lucho248 Ver Mensaje
Código Metodos:
Ver original
  1. public void botonTicket(JButton boton, DefaultTableModel modN){
  2. ...
  3.                 modN = new DefaultTableModel();
  4.                 modN = modelosBotones(modN);
  5. ....

con estas modificaciones logre que haga lo que estoy buscando.
Si alguien me puede indicar como mejorarlo, sera bien venido.
...
Si ya te funciona pues todo está bien, como no sé que hay dentro del método modelosBotones() no sabría decir como lo solucionaste realmente. Aunque me imagino que de alguna forma realizaste un mapping entre modN y las variables estáticas, le pasas la variable y el busca la referencia en las estáticas, posiblemente con ==, y devuelve la estática, realmente saber que hiciste.

Cita:
Iniciado por lucho248 Ver Mensaje
/** Intercambio los DefaultTableModel con este metodo
* @param DefaultTableModel modViejo: el modelo con datos
* @param DefaultTableModel modNuevo: el modelo en blanco, donde se copiaran los datos.
* */
public void modelos(DefaultTableModel modViejo, DefaultTableModel modNuevo) {
int filas = modViejo.getRowCount();
int col = modViejo.getColumnCount();
int i = 0, j = 0;
boolean BFilas = false;
while (i<filas && !BFilas) {

if (modViejo.getValueAt(i,j) == null || modViejo.getValueAt(i,j) == "")
BFilas = true;
else{
while (j < col){

modNuevo.setValueAt(modViejo.getValueAt(i,j), i,j);
modViejo.setValueAt("", i,j);
j++;
}
i++;
j = 0;
}
}
}
[/HIGHLIGHT]

Si alguien me puede indicar como mejorarlo, sera bien venido.
Esa parte no comprendo por qué es necesaria, con lo que expliqué no es necesario copiar un modelo sobre otro. Al fin y al cabo mM1, es una instancia de un TableModel. Tampoco creo que sea un asunto sumamente importante, si a ti te funciona pues ya estás hecho.

Conceptos que posiblemente te sean de utilidad,

1. Heredar los botones (JButton) que incluya en su definición un modelo TableModel, puesto que cada botón tiene un TableModel asociado. (Evitas los 'Array Paralelos' o el mapping que estás usando). Para eso tienes que saber como funciona la herencia.

2. No copiar los TableModel uno sobre otro, usar las referencias, puesto que al fin y al cabo son TableModel's. Técnicamente un Model no debe mantener un estado (Stateless), así que copiar uno sobre otro me parece innecesario.

3. Heredar los TableModel (AbstractTableModel) por uno tuyo que ya tenga los títulos de las columnas y tenga métodos utilitarios como isEmpty(), que evidentemente lo necesitas y lo estas usando regularmente. Usando herencia y reutilizar código, no copiar y pegar el mismo código por todo el programa (esto no es PHP, es broma, es broma), por ejemplo, isEmpty():

(auxModel.getValueAt(0, 0).equals("") || auxModel.getValueAt(0, 0).equals(null));

Y así otra serie de cosas, pero eso ya te queda de tarea si lo quieres hacer,

Saludos,

Última edición por HackmanC; 11/11/2014 a las 16:07 Razón: saber como lo arreglaste
  #6 (permalink)  
Antiguo 11/11/2014, 16:57
 
Fecha de Ingreso: octubre-2010
Mensajes: 154
Antigüedad: 13 años, 6 meses
Puntos: 5
Respuesta: paso de un DefaultTableModel a otro

Hola HackmanC, tenes razon en todo lo que decis, justamente por eso que comentas de copiar los contenidos, recurri a esa alternativa porque asignado los objetos, no los guardaba cuando volvia a llamar al metodo.

Código Java:
Ver original
  1. modN = new DefaultTableModel();
  2.                 modN = modelosBotones(modN);

probando hacer:
1) - new DefaultTableModel();............ o
2) - modelosBotones(modN); no terminaba de mantener estas asignaciones que pretendia hacer.

en cambio con
modN = modelosBotones(modN);......... con esta si me terminaba guardando los cambios en el modelo, porque? no tengo idea ja.

con modeloBotones hago esto:
Código Java:
Ver original
  1. public DefaultTableModel modelosBotones(DefaultTableModel mod){
  2.         mod = new DefaultTableModel(
  3.                 new Object[][] {
  4.                         {"", "", "", "", "", "", ""},
  5.                         {"", "", "", "", "", "", ""},
  6.                         {"", "", "", "", "", "", ""},
  7.                         {"", "", "", "", "", "", ""},
  8.                        
  9.                     },
  10.                     new String[] {
  11.                         "C\u00F3digo", "Detalle", "Cantidad", "Imp.Interno", "Pr.Unit.", "Total", "SN"
  12.                     }
  13.                 ){
  14.                 Class[] columnTypes = new Class[] {
  15.                     String.class, String.class, String.class, String.class, String.class, String.class, String.class
  16.                 };
  17.                 public Class getColumnClass(int columnIndex) {
  18.                     return columnTypes[columnIndex];
  19.                 }
  20.             };
  21.             return mod;
  22.     }
creo un modelo vacio, nada mas.

y esta linea:
(auxModel.getValueAt(0, 0).equals("") || auxModel.getValueAt(0, 0).equals(null));
en algun momento me empezo a levantar excepciones, modificandola un poco entonces, no recuerdo porque la deje asi, y me dio resultado.

Tenes razon en todo lo que me decis, pero como me daba muchos errores, empece a hacer modificaciones, hasta que se fueron eliminando estos errores, y me termino quedando de esa manera. Como alguna vez te habra pasado ja.

Gracias.
Saludos.-
  #7 (permalink)  
Antiguo 11/11/2014, 17:39
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: paso de un DefaultTableModel a otro

Hola,

Cita:
Iniciado por lucho248 Ver Mensaje
... Tenes razon en todo lo que me decis, pero como me daba muchos errores, empece a hacer modificaciones, hasta que se fueron eliminando estos errores, y me termino quedando de esa manera. Como alguna vez te habra pasado ja. ...
Comparto mucho tu opinión, además no vi el mensaje que pusiste en medio de tu respuesta anterior y la mía. Eso me pasa a mi cuando alguien responde dos veces seguidas aquí en foros del web, porque modifique un poquito el aspecto del foro con GreaseMonkey y Javascript, pero eso es otra historia.

Yo soy bastante purista con los lenguajes de programación que conozco y tengo algún tiempo de experiencia con varios, uno de ellos Java.

Todos los comentarios que escribí no son con el afán de demostrar nada, ni mucho menos criticarte negativamente, el objetivo es que, conociendo bien todo eso que comenté, resultarías trabajando menos y mas rápido, lo cual desde mi punto de vista te conviene; aunque siempre exista la posibilidad que no sea así, que no te convenga.

Seguramente con el tiempo vas a comprender los motivos por los cuales te aconsejo aplicar todo lo mencionado. Por el momento me alegro mucho que te haya funcionado y espero que continúes bien.

Saludos,

Etiquetas: clase, jtable, paso, string
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:31.