Ayuda listar datos a un Jtable en Netbeans!!!

Publicado en 'Programación' por luis12313, 1 May 2012.





  1. luis12313

    luis12313 Miembro frecuente

    Registro:
    28 Jun 2010
    Mensajes:
    104
    Likes:
    8




    Hola gente, bueno paso por aca para ver si me pueden ayudar en listar o agregar los datos que tengo en un archivo txt llamado db_Producto a un JTable.
    Lo que pasa es que me estan enseñando a trabajar con archivos txt en la cual tengo que guardar y listar todos los datos que tengo(hasta ahora ya guarde pero me falta listar en el Jtable que veen en la imagen que comparto).

    Hasta ahorita mi codigo es este:

    Código:
    private void btnListarActionPerformed(java.awt.event.ActionEvent evt) {
    
        File f = new File("Archivos/db_Producto.txt");
        FileReader fr = null;
    
        try {
            fr = new FileReader(f);
            BufferedReader br = new BufferedReader(fr);
            String linea = br.readLine();
            String texto = "";
            String texto1 = "";
            while (linea != null) {
                StringTokenizer st = new StringTokenizer(linea, ";");
                Bean_Producto prod=new Bean_Producto();
                String Codigo = st.nextToken();
                String Descripcion = st.nextToken();
                String Cantidad = st.nextToken();
                String Proveedor = st.nextToken();
                String Prec_Compra = st.nextToken();
                String Prec_Venta = st.nextToken();
                texto1 = "Producto" + "\tCliente" + "\tCantidad";
                texto = texto + Codigo + Descripcion + Cantidad ;
                linea = br.readLine();
            }
            
            
    
        } catch (IOException ex) {
            System.out.println("Error al leer el archivo" + ex.getMessage());
        } finally {
            try {
                fr.close();
            } catch (IOException ex) {
                System.out.println("Error al cerrar el archivo" + ex.getMessage());
            }
        }
        
        
    }
    [​IMG]

    Necesito que me apoyen urgentemente porfavor, les agradeceria muchoo:hi:
     
    Última edición: 1 May 2012


  2. eduar2083

    eduar2083 Miembro frecuente

    Registro:
    26 Jul 2011
    Mensajes:
    224
    Likes:
    46
    Hola.
    Para agregar un fila de datos a un JTable, tienes que hacerlo a través de su modelo, para ello utilizas su método addRow que recibe como parámetro una referencia Object. Por otro lado si los datos de cada fila están separados por un punto y coma podrías aplicar lo siguiente:
    Código:
    private void btnListarActionPerformed(java.awt.event.ActionEvent evt)
    {
    	BufferedReader br = null;
    
    	try {
    		File archivo = new File("producto.txt");
    		if (archivo.exists()) {
    			br = new BufferedReader(new FileReader(archivo));
    			String linea;
    
    			while ((linea = br.readLine()) != null) {
    				StringTokenizer token = new StringTokenizer(linea, ";");
    
    				int codigo = Integer.parseInt(token.nextToken().trim());
    				String descripcion = token.nextToken().trim();
    				int cantidad = Integer.parseInt(token.nextToken().trim());
    				String proveedor = token.nextToken().trim();
    				double pCompra = Double.parseDouble(token.nextToken().trim());
    				double pVenta = Double.parseDouble(token.nextToken().trim());
    
    				Object[] obj = new Object[] {
    					new Integer(codigo), descripcion, new Integer(cantidad), proveedor, new Double(pCompra), new Double(pVenta)
    				};
    				modelo.addRow(obj);
    			}
    			br.close();
    		}
    		else
    			JOptionPane.showMessageDialog(null, "No existe el archivo");
    	}
    	catch (IOException ex) {
    		System.out.println("Error al leer el archivo\n" + ex.getMessage());
    	}
    }
    Ahora bien, si tu componente no es un JTable y es un simple JTextArea, el trabajo es más simple, un sencilla concatenación y aplicarle el método append.

    Un saludo.
     
  3. luis12313

    luis12313 Miembro frecuente

    Registro:
    28 Jun 2010
    Mensajes:
    104
    Likes:
    8
    Gracias amigo eduar, fuiste el unico que me respondio.
    Pero lo hice de otra manera, aqui paso el codigo.SAlu2

    Código:
    File f = new File("Archivos/db_Producto.txt");
        FileReader fr = null;
        int fila;
    
        try {
            fr = new FileReader(f);
            BufferedReader br = new BufferedReader(fr);
            String linea = br.readLine();
            fila = 0;
            while (linea != null) {
                StringTokenizer st = new StringTokenizer(linea, ";");
                Bean_Producto prod=new Bean_Producto();
                String Codigo = st.nextToken();
                String Descripcion = st.nextToken();
                String Cantidad = st.nextToken();
                String Proveedor = st.nextToken();
                String Prec_Compra = st.nextToken();
                String Prec_Venta = st.nextToken();
                linea = br.readLine();
                tblListar.setValueAt(Codigo, fila, 0);
                tblListar.setValueAt(Descripcion, fila, 1);
                tblListar.setValueAt(Cantidad, fila, 2);
                tblListar.setValueAt(Proveedor, fila, 3);
                tblListar.setValueAt(Prec_Compra, fila, 4);
                tblListar.setValueAt(Prec_Venta, fila, 5);
                fila++;
            }
            
            
    
        } catch (IOException ex) {
            System.out.println("Error al leer el archivo" + ex.getMessage());
        } finally {
            try {
                fr.close();
            } catch (IOException ex) {
                System.out.println("Error al cerrar el archivo" + ex.getMessage());
            }
        }


    ----- mensaje añadido, 02-may-2012 a las 11:52 -----

    :paz:pucha ahora se me presento otro problema, pero esta vez es con el boton modificar, lo que pasa es que quiero que al hacer click en un registro del Jtable aparezcan todos los datos en sus repectivos JtextField y Combobox, y al modificarlas, modifiquen mi db_Producto.txt, para que al hacer click en el boton listar aparezca nuevamente en el Jtable los datos modificados.

    [​IMG]

    Hasta ahora logre hacer que aparezcan todos los datos en sus repectivos JtextField y Combobox, este es el codigo:

    Código:
    private void tblListarMouseClicked(java.awt.event.MouseEvent evt) {                                       
    
        int col = tblListar.getSelectedRow();
        
        txtCodigo.setText(tblListar.getModel().getValueAt(col, 0).toString());
        txtDescripcion.setText(tblListar.getModel().getValueAt(col, 1).toString());
        txtCantidad.setText(tblListar.getModel().getValueAt(col, 2).toString());
        cboProveedor.setSelectedIndex(buscarelemento(tblListar.getModel().getValueAt(col, 3).toString()));
        txtCompra.setText(tblListar.getModel().getValueAt(col, 4).toString());
        txtVenta.setText(tblListar.getModel().getValueAt(col, 5).toString());
    }  

    Espero ahora si toda la gente me pueda ayudar.Salu2:hi:
     
  4. eduar2083

    eduar2083 Miembro frecuente

    Registro:
    26 Jul 2011
    Mensajes:
    224
    Likes:
    46
    Está bien, pero no es lo más adecuado. Imagina que tu tabla contiene 20 columnas, tendrías que escribir 20 sentencias tblListar.setValueAt, ya que con dicho método tienes que indicar el índice que ocupa cada columna. En cambio la forma que te planteo es de un cacho llenar un fila completa y ello se hace con una sola sentencia, invocando al método addRow del modelo.
    Es por ello que te vuelvo a sugerir utilizar el modelo del JTable:
    Por ejemplo, junto a tu declaración JTable puedes declarar el modelo de la siguiente manera:
    Código:
    private Object[][] data = new Object[][] {};
       
       private String[] encabezado = {
          "Código", "Descripción", "Cantidad",
          "Proveedor", "Precio compra", "Precio venta"
       };
       
       private JTable tabla = new JTable();
       private DefaultTableModel modelo = new DefaultTableModel(data, encabezado);
    Con ello, tienes armado el JTable que viene a ser la vista y el modelo que viene a ser el controlador, no olvides aplicar el patrón MVC (Modelo Vista Controlador).
    Ahora bien, para cargar la data del archivo, te vuelvo a colocar el código con un ligero cambio no muy significativo:
    Código:
    private void btnListarActionPerformed(java.awt.event.ActionEvent evt)
    {
    	try {
    		File archivo = new File("Archivos/db_Producto.txt");
    		
    		if (archivo.exists()) {
    			FileReader reader = new FileReader(archivo);
    			BufferedReader br = new BufferedReader(reader);
    			
    			String linea;
    			
    			while ((linea = br.readLine()) != null) {
    				StringTokenizer token = new StringTokenizer(linea, ";");
    
    				int codigo = Integer.parseInt(token.nextToken().trim());
    				String descripcion = token.nextToken().trim();
    				int cantidad = Integer.parseInt(token.nextToken().trim());
    				String proveedor = token.nextToken().trim();
    				double pCompra = Double.parseDouble(token.nextToken().trim());
    				double pVenta = Double.parseDouble(token.nextToken().trim());
    
    				Object[] obj = new Object[] {
    					codigo, descripcion, cantidad, proveedor, pCompra, pVenta
    				};
    				modelo.addRow(obj);
    			}
    			br.close();
    		}
    		else
    			JOptionPane.showMessageDialog(null, "No se encuentra el archivo " + archivo.getName());
    	}
    	catch (IOException ex) {
    		System.out.println("Error al leer el archivo\n" + ex.getMessage());
    	}
    }
    Respecto a tu segunda pregunta, es simple. En el momento que quieres guardar el registro modificado (que imagino ocurre cuando se pincha sobre el botón guardar o modificar), capturas la data ya modificada de los componentes de entrada (JTextField, JComboBox, etc) y creas un elemento fila, es decir, un Object[]. Luego aplicas un algoritmo de búsqueda para ubicar la fila que contiene el código a modificar y le aplicas el método removeRow que recibe un elemento fila y el índice que ocupa, luego aplicas el método insertRow que recibe un elemento fila y el índice donde se va a insertar. Te posteo en código para que lo aprecies mejor:
    Código:
    // Esto modifica el JTable
    
    private void btnGuardarActionPerformed(ActionEvent event)
    {
    	// Capturamos los datos de los componentes
    	int codigo = Integer.parseInt(txtCodigo.getText());
    	String descripcion = txtDescripcion.getText();
    	int cantidad = Integer.parseInt(txtCantidad.getText());
    	String proveedor = cboProveedor.getSelectedItem().toString();
    	double pCompra = Double.parseDouble(txtCompra.getText());
    	double pVenta = Double.parseDouble(txtVenta.getText());
    
    	// Armamos un elemento fila
    	Object[] modificado = new Object[]
    	{
    		codigo, descripcion, cantidad, proveedor, pCompra, pVenta
    	};
    
    	// Aplicamos una simple búsqueda lineal
    	int i;
    	for (i = 0; i < modelo.getRowCount() && codigo != modelo.getValueAt(i, 0); ++i);
    
    	// Si se ha encontrado
    	if (i < modelo.getRowCount()) {
    		// Remover la fila encontrada
    		modelo.removeRow(i);
    		
    		// insertar la nueva fila
    		modelo.insertRow(i, modificado);
    		
    		// Aquí podrías realizar un volcado del contenido del JTable ya modificado al archivo
    	}
    	else	// sino, mensaje
    		JOptionPane.showMessageDialog(this, "Código no existe");
    }
    Como puedes ver, aquí si resulta útil el método getValueAt ya que necesitamos acceder a una determinada columna de cada fila.

    Espero te sea de ayuda.

    Un saludo.
     
    A shifted le gustó este mensaje.