Java - Ayuda con JTable

   
Vista:
Imágen de perfil de alpepep

Ayuda con JTable

Publicado por alpepep (8 intervenciones) el 28/10/2007 11:04:21
Hola a todos, en todos los ejemplos que he visto sobre el uso del JTable los datos se rellenan desde el constructor, como se hace si los datos estan en una BD, por ej. Access?

class MyTableModel extends AbstractTableModel {
private String[] columnNames = {"First Name","Last Name",......};
private Object[][] data = {
{"Mary", "Campione","Snowboarding", new Integer(5), new Boolean(false)},
{"Alison", "Huml","Rowing", new Integer(3), new Boolean(true)},
{"Kathy", "Walrath","Knitting", new Integer(2), new Boolean(false)},
{"Sharon", "Zakhour","Speed reading", new Integer(20), new Boolean(true)},
{"Philip", "Milne","Pool", new Integer(10), new Boolean(false)}
};

Lo he intentado de todas las formas que mis pocos conocimientos me permiten pero no lo he conseguido con TableModel. He verificado que la conexion a la BD se establece correctamente y el ResultSet tiene los datos cargados.

Un saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Ayuda con JTable

Publicado por Gilberto (378 intervenciones) el 28/10/2007 18:44:50
muestra el código donde recuperas tus datos de la tabla access, y donde rellenas tu tablemodel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de alpepep

RE:Ayuda con JTable

Publicado por alpepep (8 intervenciones) el 28/10/2007 19:45:29
Gracias Gilberto, hace unos minutos que acabo de resolverlo y al entrar a contestarme a mi mismo veo tu respuesta, lo que he hecho es lo siguiente:

He definido el metodo "nuevaFila()" en class "MyTableModel extends AbstractTableModel":

public void nuevaFila() {
Object[][] datos = new Object[getRowCount()+1][getColumnCount()];
for (int i=0; i<getRowCount(); i++)
datos[i] = data[i];
data = datos ;
}

"data" es el Object[][] que contiene los datos en MyTableModel
"datos" es un nuevo Object[][] donde se copian los datos de "data" y que se crea con una fila mas que "data" y las mismas columnas.
Finalmente se copia "datos" en "data", con ello se consigue que "data" tenga una fila mas con los datos en blanco que se actualiza con el metodo setValueAt de MyTableModel.

Me parece poco eficiente que para cada registro que quiera añadir tener que copiar todos los datos en un array para añadir una fila y de nuevo copiar este nuevo array sobre el que contiene los datos del TableModel y luego actualizar la nueva fila con setValueAt, existe una manera mejor de hacerlo?

Muchas gracias.

Este es el codigo completo:

import java.sql.*;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import java.awt.*;
import java.awt.event.*;

public class TableDemo extends JFrame {
private boolean DEBUG = true;

private static Connection con;
private static ResultSet rsJornada;
private static MyTableModel myModel;

public TableDemo() {
super("TableDemo");

myModel = new MyTableModel();
JTable table = new JTable(myModel);
table.setPreferredScrollableViewportSize(new Dimension(500, 70));

JScrollPane scrollPane = new JScrollPane(table);

getContentPane().add(scrollPane, BorderLayout.CENTER);

addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}

class MyTableModel extends AbstractTableModel {

final String[] columnNames = {"Fecha","J 1 inicio","J 1 fin","J 1 sala",
"J 2 inicio","J 2 fin","J 2 sala","Horas",
"€ hora","Importe","Iva","Irpf","Total","Facturado"};

public Object[][] data = {};

public int getColumnCount() {return columnNames.length;}

public int getRowCount() {return data.length;}

public String getColumnName(int col) {return columnNames[col];}

public Object getValueAt(int row, int col) {return data[row][col];}

public void setValueAt(Object value, int row, int col) {data[row][col] = value;}

public void nuevaFila() {
Object[][] datos = new Object[getRowCount()+1][getColumnCount()];
for (int i=0; i<getRowCount(); i++)
datos[i] = data[i];
data = datos ;
}
}

public static void conectar() {
try
{
String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=facturas.mdb";
Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection (url, "", "");
}
catch (Exception e)
{
JOptionPane.showMessageDialog(null,"\nError al conectar con la BD: \n" + e.getMessage()
+ "\n","Facturación",JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
}

public static void creartablajornada() {
Statement selectJornada = null;
try {selectJornada = con.createStatement(rsJornada.TYPE_SCROLL_SENSITIVE, rsJornada.CONCUR_UPDATABLE);}
catch (SQLException ex) {ex.printStackTrace();}
try {rsJornada = selectJornada.executeQuery("SELECT * FROM Jornada");}
catch (SQLException ex) {ex.printStackTrace();}
int i;
try {
while (rsJornada.next())
{
myModel.nuevaFila();
i = myModel.getRowCount()-1;
myModel.setValueAt(rsJornada.getDate("Fecha"),i,0);
myModel.setValueAt(rsJornada.getTime("J1inicio"),i,1);
myModel.setValueAt(rsJornada.getTime("J1fin"),i,2);
myModel.setValueAt(rsJornada.getInt("J1sala"),i,3);
myModel.setValueAt(rsJornada.getTime("J2inicio"),i,4);
myModel.setValueAt(rsJornada.getTime("J2fin"),i,5);
myModel.setValueAt(rsJornada.getInt("J2sala"),i,6);
myModel.setValueAt(rsJornada.getString("TThoras"),i,7);
myModel.setValueAt(rsJornada.getFloat("PrecioHora"),i,8);
myModel.setValueAt(rsJornada.getFloat("TTimporte"),i,9);
myModel.setValueAt(rsJornada.getFloat("ImporteIva"),i,10);
myModel.setValueAt(rsJornada.getFloat("ImporteIrpf"),i,11);
myModel.setValueAt(rsJornada.getFloat("TotalJornada"),i,12);
myModel.setValueAt(rsJornada.getBoolean("Facturado"),i,13);
}
}
catch (SQLException ex) {ex.printStackTrace();}
}

public static void main(String[] args) {
TableDemo frame = new TableDemo();
conectar();
creartablajornada();
frame.pack();
frame.setVisible(true);
}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con JTable

Publicado por Perseuss (1 intervención) el 01/04/2008 05:56:53
Es mas facil de lo que piensas. se puede hacer de muchas formas una de ellas es la siguiente:

Cada vez que realizas una consulta a tu base de datos la puedes ir cargando en una variable.

Luego creas un array que tenga el numero de columnas que tiene tu tabla luego de esto adicionas una nueva fila a la tabla con el array que construiste de la siguiete forma:

(Con una sola consulta los llenas a todos)
Valor1 = valor1_del_Resulset;
Valor2 = valor2_del_Resulset;
Valor3 = valor3_del_Resulset;

fila = new array(3);
fila{0} = "VAlor1";
fila{1} = "VAlor2";
fila{2} = "VAlor3";

jTablemodel.addRow(fila);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar