Discussion:
Problemas con JTable y DefaultTableModel
(demasiado antiguo para responder)
Motoko
2003-12-16 09:43:26 UTC
Permalink
Buenas.

Estoy realizando una pequeña aplicación donde estoy utilizando un JTable,
que me esta llevando de cabeza.

El codigo donde creo el modelo del JTable es el siguiente:

public DefaultTableModel getListado(String fichero) {
String Direccion = "/var/log/" + fichero;
DefaultTableModel model = new DefaultTableModel();

try {
FileReader file = new FileReader(Direccion);
BufferedReader Buff = new BufferedReader(file);
boolean eof = false;
while (!eof) {
String Linea = Buff.readLine();
if (Linea == null)
eof = true;
else {
model.addRow(new Object[] {Linea});
}
}
Buff.close(); //Cerrar Buffer
} catch (IOException Err) {
Mensaje.getMensaje(Err.toString());
} catch (NullPointerException Err) {
Mensaje.getMensaje(Err.toString());
}
return model;
}

Relleno el "Model" del JTable con los nombres de los archivos que hay dentro
de un directorio. Pero el caso es que no funciona, cuando muestro el JTable
no me aparece nada. Lo que no se es si es correcto la forma con que creo el
modelo, o me estoy equivocando en algo.
Asi mismo a continuación pongo como creo el JTable

Modelos Modelo = new Modelos();
Tabla = new JTable(Modelo.getListado(Dato));

Gracias si alguien puede echarme una mano, es que no se como coger esto del
JTable.
--
"Hay 10 tipos de personas en este mundo."
"Las que saben binario y las que no."
Marta
2003-12-16 10:56:44 UTC
Permalink
Yo he realizado una aplicación parecida pero no defino el modelo de la tabla,
simplemente indico en un array el nombre de las columnas y en otro el contenido
de las filas. Ejemplo:

String[] columnas = {"col1", "col2}; // Dos columnas
String[][] filas = new String[num_filas][2]; // Numero de filas y 2 columnas

// Antes de crear la tabla tienes que añadir el contenido del fichero al array
filas. Lo puedes hacer con
// un bucle. Ej: filas[i][0] = Linea_actual;

JTable table = new JTable(filas,columnas);

También puedes utilizar vectores en lugar de arrays (mira el API).

Espero que te ayude.
Post by Motoko
Buenas.
Estoy realizando una pequeña aplicación donde estoy utilizando un JTable,
que me esta llevando de cabeza.
public DefaultTableModel getListado(String fichero) {
String Direccion = "/var/log/" + fichero;
DefaultTableModel model = new DefaultTableModel();
try {
FileReader file = new FileReader(Direccion);
BufferedReader Buff = new BufferedReader(file);
boolean eof = false;
while (!eof) {
String Linea = Buff.readLine();
if (Linea == null)
eof = true;
else {
model.addRow(new Object[] {Linea});
}
}
Buff.close(); //Cerrar Buffer
} catch (IOException Err) {
Mensaje.getMensaje(Err.toString());
} catch (NullPointerException Err) {
Mensaje.getMensaje(Err.toString());
}
return model;
}
Relleno el "Model" del JTable con los nombres de los archivos que hay dentro
de un directorio. Pero el caso es que no funciona, cuando muestro el JTable
no me aparece nada. Lo que no se es si es correcto la forma con que creo el
modelo, o me estoy equivocando en algo.
Asi mismo a continuación pongo como creo el JTable
Modelos Modelo = new Modelos();
Tabla = new JTable(Modelo.getListado(Dato));
Gracias si alguien puede echarme una mano, es que no se como coger esto del
JTable.
--
"Hay 10 tipos de personas en este mundo."
"Las que saben binario y las que no."
Motoko
2003-12-17 01:00:03 UTC
Permalink
Post by Marta
Yo he realizado una aplicación parecida pero no defino el modelo de la
tabla, simplemente indico en un array el nombre de las columnas y en otro
String[] columnas = {"col1", "col2}; // Dos columnas
String[][] filas = new String[num_filas][2]; // Numero de filas y 2 columnas
JTable table = new JTable(filas,columnas);
También puedes utilizar vectores en lugar de arrays (mira el API).
Espero que te ayude.
Gracias por la ayuda. Al final he usado un vector. Pero ahora tengo un
pequeño problema. Es el siguiente.

JTable tabla = new JTable(getFilas(Datos), getColumnas());

Donde getFilas -> es una funcion de otra clase donde obtengo las filas.
Donde getColumnas -> es una funcion de otra clase donde obtengo las columnas
(en este caso solamente es una columna)

Y despues hago un return tabla. Entonces en la Main tengo lo siguiente

JTable Tabla = ClasePersonal.getTabla(Datos); //Donde ClasePersonal es donde
realizo el new JTable y despues el "return".

En principio no me da ningun problema, pero cuando voy a hacer un
Tabla.setBounds(10,10,500,500);

Me da la siguiente exception: javaj.lang.ClassCastException

De donde viene el problema. Que no esta creada bien la tabla.

Gracias si por la ayuda
--
"Hay 10 tipos de personas en este mundo."
"Las que saben binario y las que no."
Marta
2003-12-17 07:26:06 UTC
Permalink
Pues en principio parece que la tabla está bien creada. Creo que tu problema es
al poner los límites de la tabla. El método "setBounds" JTable lo hereda de
Component, prueba a hacer esto:

((Component)tabla).setBounds(10,10,500,500);

De todas formas exactamente que quieres hacer con esta función situar la tabla o
dar dimensión?? Xq si lo anterior no funciona seguro que hay otra forma.

Un saludo.
Post by Motoko
Post by Marta
Yo he realizado una aplicación parecida pero no defino el modelo de la
tabla, simplemente indico en un array el nombre de las columnas y en otro
String[] columnas = {"col1", "col2}; // Dos columnas
String[][] filas = new String[num_filas][2]; // Numero de filas y 2 columnas
JTable table = new JTable(filas,columnas);
También puedes utilizar vectores en lugar de arrays (mira el API).
Espero que te ayude.
Gracias por la ayuda. Al final he usado un vector. Pero ahora tengo un
pequeño problema. Es el siguiente.
JTable tabla = new JTable(getFilas(Datos), getColumnas());
Donde getFilas -> es una funcion de otra clase donde obtengo las filas.
Donde getColumnas -> es una funcion de otra clase donde obtengo las columnas
(en este caso solamente es una columna)
Y despues hago un return tabla. Entonces en la Main tengo lo siguiente
JTable Tabla = ClasePersonal.getTabla(Datos); //Donde ClasePersonal es donde
realizo el new JTable y despues el "return".
En principio no me da ningun problema, pero cuando voy a hacer un
Tabla.setBounds(10,10,500,500);
Me da la siguiente exception: javaj.lang.ClassCastException
De donde viene el problema. Que no esta creada bien la tabla.
Gracias si por la ayuda
--
"Hay 10 tipos de personas en este mundo."
"Las que saben binario y las que no."
EdUarDo
2003-12-17 08:27:52 UTC
Permalink
Post by Marta
El método "setBounds" JTable lo hereda de
((Component)tabla).setBounds(10,10,500,500);
No es por nada, pero como tú dices, JTable hereda de Component,
¿por qué haces casting a Component para llamar a setBounds?

tabla.setBounds(...) es lo correcto.
Motoko
2003-12-17 09:33:11 UTC
Permalink
Post by EdUarDo
Post by Marta
El método "setBounds" JTable lo hereda de
((Component)tabla).setBounds(10,10,500,500);
No es por nada, pero como tú dices, JTable hereda de Component,
¿por qué haces casting a Component para llamar a setBounds?
tabla.setBounds(...) es lo correcto.
Lo que yo hago es añadir la tabla en un JPanel

Panel.add(Tabla); //Añadir Tabla a JPanel

Y entonces despues situo la tabla dentro del panel, y es aqui, cuando situo
la tabla dentro del panel cuando se produce el error.

Y con respecto a poner el error, es muy, pero que muy largo, empieza a darme
errores como de swing ... por eso solamente pongo la frase de la excepcion

Pero gracias por la ayuda.
--
"Hay 10 tipos de personas en este mundo."
"Las que saben binario y las que no."
EdUarDo
2003-12-17 10:01:04 UTC
Permalink
Post by Motoko
Lo que yo hago es añadir la tabla en un JPanel
Panel.add(Tabla); //Añadir Tabla a JPanel
Pues no me creo que en esta línea te dé un error de ClassCastException.

Si Panel es un JPanel, y Tabla un JTable, es imposible que te dé ese
error. El método add de Component (y por tanto de JPanel) es:


public Component add(Component comp)

que espera un Component, y JTable es un Component, luego no puede ser.
El error te tiene que estar ocurriendo en otra línea...


Por cierto, las variables, atributos, etc... se escriben en minúsculas.
Las clases con la primera en mayúscula, las constantes todo en
mayúsculas. Por convenio, vamos.
Marta
2003-12-17 09:41:10 UTC
Permalink
He comentado lo de hacer casting porque según he entendido la tabla que se añade
a un panel es devuelta por algún método, no? Puede que esté devolviendo un
objeto como tal (Object) y no un JTable...
Post by Motoko
Post by EdUarDo
Post by Marta
El método "setBounds" JTable lo hereda de
((Component)tabla).setBounds(10,10,500,500);
No es por nada, pero como tú dices, JTable hereda de Component,
¿por qué haces casting a Component para llamar a setBounds?
tabla.setBounds(...) es lo correcto.
Lo que yo hago es añadir la tabla en un JPanel
Panel.add(Tabla); //Añadir Tabla a JPanel
Y entonces despues situo la tabla dentro del panel, y es aqui, cuando situo
la tabla dentro del panel cuando se produce el error.
Y con respecto a poner el error, es muy, pero que muy largo, empieza a darme
errores como de swing ... por eso solamente pongo la frase de la excepcion
Pero gracias por la ayuda.
--
"Hay 10 tipos de personas en este mundo."
"Las que saben binario y las que no."
EdUarDo
2003-12-17 10:36:52 UTC
Permalink
Post by Marta
He comentado lo de hacer casting porque según he entendido la tabla que se añade
a un panel es devuelta por algún método, no? Puede que esté devolviendo un
objeto como tal (Object) y no un JTable...
Me parece que te estás haciendo un lío.
Lo que devuelve el método add es un Component. Hasta aquí todo bien.
Pero el casting lo tendrías que hacer para asginar ese valor devuelto a
una variable. Es decir, si haces algo así:

JTable tabla2 = (JTable) panel.add(tabla1);

Pero no por hacer esto:

panel.add(tabla1);

vas a tener que hacer después cosas como:

((Component)tabla1).setBounds(10,10,500,500);

tu variable tabla1 seguirá sienfo un JTable, aunque lo hayas
añadido al panel.
Marta
2003-12-17 10:45:15 UTC
Permalink
A ver si nos entendemos... Según lo he ha escrito Motoko, él ha desarrollado un método
que le devuelve la JTable creada y puede que lo que esté devolviendo sea un Object.
Por eso cuando hace "setBounds()" sobre el objeto, de un error de Casting.
Post by EdUarDo
Post by Marta
He comentado lo de hacer casting porque según he entendido la tabla que se añade
a un panel es devuelta por algún método, no? Puede que esté devolviendo un
objeto como tal (Object) y no un JTable...
Me parece que te estás haciendo un lío.
Lo que devuelve el método add es un Component. Hasta aquí todo bien.
Pero el casting lo tendrías que hacer para asginar ese valor devuelto a
JTable tabla2 = (JTable) panel.add(tabla1);
panel.add(tabla1);
((Component)tabla1).setBounds(10,10,500,500);
tu variable tabla1 seguirá sienfo un JTable, aunque lo hayas
añadido al panel.
EdUarDo
2003-12-17 12:22:23 UTC
Permalink
Post by Marta
A ver si nos entendemos... Según lo he ha escrito Motoko, él ha desarrollado un método
que le devuelve la JTable creada y puede que lo que esté devolviendo sea un Object.
Por eso cuando hace "setBounds()" sobre el objeto, de un error de Casting.
No, si tienes un método

Object devuelveTable() {
return new JTable();
}

Y esto por otro lado:

JTable table = devuelveTable();

ESTO NO COMPILA, luego tienes que haber hecho

JTable table = (JTable) devuelveTable();

así que luego puedes hacer perfectamente table.setBounds(...) o lo que
te dé la gana.

Su código, según él, es este:


JTable Tabla = ClasePersonal.getTabla(Datos);

//Donde ClasePersonal es donde realizo el new JTable

// Aquí dice que le da el ClassCastException -> NO PUEDE SER, porque
en la línea anterior no ha tenido que hacer un casting, luego seguro
que tiene un JTable. ¿Me equivoco? Tabla es un JTable y tiene el método
setBounds(), punto. Otra cosa es que no nos haya puesto el código
como él lo tiene de verdad.

Tabla.setBounds(10,10,500,500);
Motoko
2003-12-17 15:23:16 UTC
Permalink
Post by EdUarDo
Post by Marta
A ver si nos entendemos... Según lo he ha escrito Motoko, él ha
desarrollado un método que le devuelve la JTable creada y puede que lo
que esté devolviendo sea un Object. Por eso cuando hace "setBounds()"
sobre el objeto, de un error de Casting.
No, si tienes un método
Object devuelveTable() {
return new JTable();
}
JTable table = devuelveTable();
ESTO NO COMPILA, luego tienes que haber hecho
JTable table = (JTable) devuelveTable();
así que luego puedes hacer perfectamente table.setBounds(...) o lo que
te dé la gana.
JTable Tabla = ClasePersonal.getTabla(Datos);
//Donde ClasePersonal es donde realizo el new JTable
// Aquí dice que le da el ClassCastException -> NO PUEDE SER, porque
en la línea anterior no ha tenido que hacer un casting, luego seguro
que tiene un JTable. ¿Me equivoco? Tabla es un JTable y tiene el método
setBounds(), punto. Otra cosa es que no nos haya puesto el código
como él lo tiene de verdad.
Tabla.setBounds(10,10,500,500);
EdUarDo lo que yo tengo es un metodo que me devuelve un JTable ya
construida, de la siguiente manera:

public JTable DevuelveLista() {
JTable Tabla = new JTable(Fila, Columna);
return Tabla;
}

Y entonces en OTRO SITIO tengo

JTable Table = DevuelveLista();

Pero el problema me sale cuando hago "Table.setBounds(10,10,500,500);"

Lo se porque lo controlo mediante "mensajes ;)" en cada paso visualizo un
mensaje, entonces cuando llego al setbounds, visualizo mensaje, y me
aparecen los errores en la consola, antes del setbounds no visualizo ningun
error en consola.
Post by EdUarDo
Otra cosa es que no nos haya puesto el código
como él lo tiene de verdad.
Y si es el codigo que tengo ...

De nuevo gracias por la ayuda, y perdon por las molestias.
--
"Hay 10 tipos de personas en este mundo."
"Las que saben binario y las que no."
EdUarDo
2003-12-17 15:35:57 UTC
Permalink
Post by Motoko
EdUarDo lo que yo tengo es un metodo que me devuelve un JTable ya
public JTable DevuelveLista() {
JTable Tabla = new JTable(Fila, Columna);
return Tabla;
}
Y entonces en OTRO SITIO tengo
JTable Table = DevuelveLista();
Exacto, justo lo que he estado diciendo.
Post by Motoko
Pero el problema me sale cuando hago "Table.setBounds(10,10,500,500);"
Lo se porque lo controlo mediante "mensajes ;)" en cada paso visualizo un
mensaje, entonces cuando llego al setbounds, visualizo mensaje, y me
aparecen los errores en la consola, antes del setbounds no visualizo ningun
error en consola.
Pues tienes que tener el error en la sentencia del mensaje,
porque en "Table.setBounds(10,10,500,500);"
no te puede dar un ClassCastException.
Aunque Table no tuviese ese método, no te puede dar ese error, primero
porque no compila, y segundo, porque en todo caso la excepción sería
NoSuchMethodException.
Post by Motoko
De nuevo gracias por la ayuda, y perdon por las molestias.
Tranqui, si no es molestia, pero me gustaría saber qué narices está
pasando :). Curiosidad, más que nada.
Motoko
2003-12-17 16:19:49 UTC
Permalink
Post by EdUarDo
Post by Motoko
EdUarDo lo que yo tengo es un metodo que me devuelve un JTable ya
public JTable DevuelveLista() {
JTable Tabla = new JTable(Fila, Columna);
return Tabla;
}
Y entonces en OTRO SITIO tengo
JTable Table = DevuelveLista();
Exacto, justo lo que he estado diciendo.
Post by Motoko
Pero el problema me sale cuando hago "Table.setBounds(10,10,500,500);"
Lo se porque lo controlo mediante "mensajes ;)" en cada paso visualizo un
mensaje, entonces cuando llego al setbounds, visualizo mensaje, y me
aparecen los errores en la consola, antes del setbounds no visualizo
ningun error en consola.
Pues tienes que tener el error en la sentencia del mensaje,
porque en "Table.setBounds(10,10,500,500);"
no te puede dar un ClassCastException.
Aunque Table no tuviese ese método, no te puede dar ese error, primero
porque no compila, y segundo, porque en todo caso la excepción sería
NoSuchMethodException.
Post by Motoko
De nuevo gracias por la ayuda, y perdon por las molestias.
Tranqui, si no es molestia, pero me gustaría saber qué narices está
pasando :). Curiosidad, más que nada.
Pero es que lo más extraño, que me hace pensar que cuando solamente cuando
en el OTRO SITIO pongo JTable Table = new JTable(); y realizo lo siguiente:
Panel.add(Tabla);
Tabla.setBounds();

no me aparece ningun error. Asi mismo si pongo todo lo de antes, pero no
pongo el Tabla.setBounds(); tampoco visualizo ningun error. Esto es lo que
me hace pensar que el problema puede estar en el "setBounds".

Eso es lo que me escama. Gracias de nuevo.
--
"Hay 10 tipos de personas en este mundo."
"Las que saben binario y las que no."
EdUarDo
2003-12-17 16:41:19 UTC
Permalink
No sé, me falta información, hay algo que no has puesto.

Si te creas esta clase, y la ejecutas no da errores...

import javax.swing.*;

public class Foo {
public Foo() {
super();
}

public static void main(String[] args) {
new Foo().foo();
}

public void foo() {
JTable tabla = foo2();
JPanel panel = new JPanel();
panel.add(tabla);
tabla.setBounds(10, 10, 500, 500);
}

public JTable foo2() {
JTable tabla = new JTable();
return tabla;
}
}

Así que algo estás haciendo más...
znôrt
2003-12-17 18:32:14 UTC
Permalink
Post by EdUarDo
No sé, me falta información, hay algo que no has puesto.
Yo, si me permitis, hace rato ke sigo el hilo y está bastante confuso.
Motoko, a ver si puedes aislar un cacho de código que compile y que
produzca el error, así salimos de dudas. Seguro que es una parida.

En su defecto, podrías poner el stack-trace completo (o al menos unas
10 o 15 líneas) y no sólo la primera línea de error.

saludos
znôrt
Motoko
2003-12-17 21:19:55 UTC
Permalink
Post by EdUarDo
No sé, me falta información, hay algo que no has puesto.
Si te creas esta clase, y la ejecutas no da errores...
import javax.swing.*;
public class Foo {
public Foo() {
super();
}
public static void main(String[] args) {
new Foo().foo();
}
public void foo() {
JTable tabla = foo2();
JPanel panel = new JPanel();
panel.add(tabla);
tabla.setBounds(10, 10, 500, 500);
}
public JTable foo2() {
JTable tabla = new JTable();
return tabla;
}
}
Así que algo estás haciendo más...
Gracias, ya lo he conseguido. El problema, venia de cuando construia la
tabla. Pero ya esta solucionado. Que al hacer new JTable(Filas, Columnas)
tenia algo mal.

Ahora lo que me no veo son los titulos de las columnas, pero ... a una cosa,
para que la columna me ocupe toda la tabla como se tendria que hacer??

Pero ante todo, gracias por la inestimable ayuda que me habeis dado todos.
--
"Hay 10 tipos de personas en este mundo."
"Las que saben binario y las que no."
EdUarDo
2003-12-18 08:24:11 UTC
Permalink
Post by Motoko
Post by EdUarDo
Así que algo estás haciendo más...
Gracias, ya lo he conseguido. El problema, venia de cuando construia la
tabla. Pero ya esta solucionado. Que al hacer new JTable(Filas, Columnas)
tenia algo mal.
O sea, que no era en esa línea. Si hubieses puesto las trazas de la
excepción, como te dije en uno de los primeros post, lo habríamos
visto antes.

EdUarDo
2003-12-17 08:32:23 UTC
Permalink
Post by Motoko
JTable tabla = new JTable(getFilas(Datos), getColumnas());
Donde getFilas -> es una funcion de otra clase donde obtengo las filas.
Donde getColumnas -> es una funcion de otra clase donde obtengo las columnas
(en este caso solamente es una columna)
Y despues hago un return tabla. Entonces en la Main tengo lo siguiente
JTable Tabla = ClasePersonal.getTabla(Datos); //Donde ClasePersonal es donde
realizo el new JTable y despues el "return".
En principio no me da ningun problema, pero cuando voy a hacer un
Tabla.setBounds(10,10,500,500);
Me da la siguiente exception: javaj.lang.ClassCastException
¿Enqué línea te da la excepción?, ¿has probado a capturarla y a imprimir
la pila de llamadas?

Si setBounds no perteneciera a JTable, simplemente no te compilaría.
Motoko
2003-12-16 15:17:52 UTC
Permalink
Post by Motoko
Buenas.
Estoy realizando una pequeña aplicación donde estoy utilizando un JTable,
que me esta llevando de cabeza.
public DefaultTableModel getListado(String fichero) {
String Direccion = "/var/log/" + fichero;
DefaultTableModel model = new DefaultTableModel();
try {
FileReader file = new FileReader(Direccion);
BufferedReader Buff = new BufferedReader(file);
boolean eof = false;
while (!eof) {
String Linea = Buff.readLine();
if (Linea == null)
eof = true;
else {
model.addRow(new Object[] {Linea});
}
}
Buff.close(); //Cerrar Buffer
} catch (IOException Err) {
Mensaje.getMensaje(Err.toString());
} catch (NullPointerException Err) {
Mensaje.getMensaje(Err.toString());
}
return model;
}
Relleno el "Model" del JTable con los nombres de los archivos que hay
dentro de un directorio. Pero el caso es que no funciona, cuando muestro
el JTable no me aparece nada. Lo que no se es si es correcto la forma con
que creo el modelo, o me estoy equivocando en algo.
Asi mismo a continuación pongo como creo el JTable
Modelos Modelo = new Modelos();
Tabla = new JTable(Modelo.getListado(Dato));
Gracias si alguien puede echarme una mano, es que no se como coger esto
del JTable.
--
"Hay 10 tipos de personas en este mundo."
"Las que saben binario y las que no."
Continúe leyendo en narkive:
Resultados de búsqueda para 'Problemas con JTable y DefaultTableModel' (Preguntas y respuestas)
3
respuestas
¿como usar jTable en netbeans para agregarles elemntos?
iniciado 2011-08-15 07:38:29 UTC
diseño y programación
Loading...