jTable y su "Modelo"

   Continuando con las tablas en Java, vamos a ver como crear las tablas y manejarlas, en la entrada de "Tablas Swing" explico un poco del tema, pero en esta entrada explicare mas del tema y date más tips. Para evitarnos problemas utilizaremos un "Modelo" para nuestra tabla, ¿como funciona esto?, la verdad que explicarlo es medio enredado, así que mejor una imagen:

   Básicamente es crear la tabla, cargarle el modelo y agregar la data, esto se hace con la finalidad de editar el modelo que es mas fexible para utilizar solo la tabla como una especie de panel el cual contendra los datos, en realidad lo que editamos es el modelo, en otras palabras es como hacer galletas, el molde es nuestro modelo, la data es la masa y la galleta es la tabla.
   Quedando claros en esto (pienso yo) vamos con algunos truquillos importantes e imprecindibles. Para crear el modelo y agregarselo a la tabla.
DefaultTableModel modelo = new DefaultTableModel();
JTable tabla = new JTable(modelo);
   Agregar columnas

modelo.addColumn("columna");
   Agregar datos.
Object [] filas = new Object[2];
filas[0] = "dato columna 1";
filas[1] = "dato columna 2";
modelo.addRow ( filas );
   Borrar datos.
modelo.removeRow(FILA);
   Modificar.
modelo.setValueAt ("nuevo dato", fila, columna);
   Obtener el valor donde se hace click.
public void mouseClicked(MouseEvent e) {
int fila = tabla.rowAtPoint(evt.getPoint());
int columna = tabla.columnAtPoint(evt.getPoint());
if ((fila > -1) && (columna > -1))
System.out.println(modelo.getValueAt(fila,columna));
}
   Hacer que la celda no se edite.
public boolean isCellEditable (int row, int column){
if (column == 3)
return true;
return false;
}
   Deshabilitar el movimiento de columnas.
JTable tabla = new JTable();
tabla.getTableHeader().setReorderingAllowed(false);
   Cambiar el tipo de dato.
public Class getColumnClass(int columna) {
if (columna == 0) return Boolean.class;
if (columna == 1) return Integer.class;
return Object.class;
}
   Agregarle un Scroll.
JTable tabla = new JTable();
JScrollPane scroll = new JScrollPane(tabla);
JTable tabla = new JTable();
JScrollPane scroll = new JScrollPane();
scroll.setViewportView(tabla);

69 Comentarios

Escribir Comentario
Jose Fermin
AUTOR
25 de julio de 2010, 16:26 delete

Hola Genial tu blog!!
pues espero me puedas ayudar, soy principiante en java y uso netbeans, estado buscando informacion para que en el JTable no sea editable o que almenos solo 3 columnas sean editables, vi el mismo metodo que pusiste en otra pagina pero aun asi sigue siendo editable. Podrias explicarme como realizar esto?
Gracias
Y lleno mi JTable desde mi base de datos en MySql

Responder
avatar
_CarlitoX_
AUTOR
25 de julio de 2010, 21:37 delete

Hola Jose, bueno, si usas netbeans la cosa va más fácil aun, lo único que debes hacer es quitarle la opción "enabled" para que el usuario no pueda editar los datos en ella, ahora, si lo que quieres es que queden totalmente ineditables el netbeans también tiene esa opción, vas a las propiedades de la tabla y la edición columnas tienes la opción "editable", la desactivas y listo, problema resuelto, aunque sinceramente no veo el problema en esto porque mientras el usuario no guarde los datos no podrá modificar nada en la BD, prueba y cuéntame como te va, saludos.

Responder
avatar
Jose Fermin
AUTOR
26 de julio de 2010, 9:48 delete

ggg...si eso si lo probe para que no pueda modificar toda la tabla, pero necesito que 3 columnas puedan ser editables, para que el usuario introdusca en mi caso dias trabajados, horas extras y si pidio algun prestamo.
Ya que en los demas campos se calcularan automaticamente, ademas de mostrar el nombre y salario diario del empleado, una vez ingresado los dias trabajado y las horas extras, al darle en el boton guardar, se guardara en la base de datos(por sierto aqui tambien tengo problemas XD) y los campos calculados como restriccion no deben de ser modificados.
Gracias por tu pronta respuesta

Responder
avatar
_CarlitoX_
AUTOR
26 de julio de 2010, 10:08 delete

Mmmm... bueno, vamos entonces por partes, primero resolvamos lo de la tabla, para todo esto lo mejor es utilizar el modelado, una vez empleado el modelo haces lo siguiente:

public boolean isCellEditable (int fila, int columna){
if (column == LA COLUMNA)
return true;
else
return false;
}

llamas el metodo al hacer doble click indicandole lo que el usuario no podra editar la columna, "LA COLUMNA" es el numero de columna que no quieres editar, fila y columna los puedes obtener usando el método getPoint():

int fila = tabla.rowAtPoint(e.getPoint());
int columna = tabla.columnAtPoint(e.getPoint());

Prueba esto y me avisas, tranquilo que si le damos solución!!

Responder
avatar
Jose Fermin
AUTOR
26 de julio de 2010, 11:18 delete

oye el metodo se pone en la misma clase donde lleno mi modelo o donde tengo mi jpanel? pues en el jpanel fue donde puse mi metodo, y pues probe llame el metodo en el mousecliked y nada sigue siendo editable todas las columnas.

Responder
avatar
_CarlitoX_
AUTOR
26 de julio de 2010, 11:36 delete

Mmmmm... publica algo de tu codigo para ver como estas haciendo, es extraño que no te funcionara, el metodo debes colocarlo en cualquier parte de la clase, es indiferente donde lo coloques puesto que lo llamas y listo, en eso consiste Java.... En el mouseclicked vas a tomar los valores de la fila y columna y llamas al metodo para saber si se esta editando o no, recuerda colocar la opcion editable = false en las propiedades de la tabla con netbeans.

Responder
avatar
Jose Fermin
AUTOR
26 de julio de 2010, 12:02 delete

pues utilizo dos modelos uno que visualiza los recibos de nomina guardados y otro modelo para el nuevo recibo en el nuevo recibo es donde debe de tener las restricciones

if(jTable1.getModel()==Nuevomod)
{
// jTable1.setEnabled(false);
int fila = jTable1.rowAtPoint(evt.getPoint());
int colum = jTable1.columnAtPoint(evt.getPoint());

if(fila > -1)
{
getDatoTablaNuevomod(fila);//para subirlo a los jtextfield
// Nuevomod.isCellEditable(fila, colum);
isCellEditable(fila, colum);

}
// TablaNueva();
}

mi llenado de datos al modelo es parecido al tuyo solo q es en una clase normal y sin metadatos, ago un select pongo el nombre de las columnas y las voy llenando

modelo.addColumn("Nombre");//0
modelo.addColumn("SDI");//1
modelo.addColumn("DT");//2
modelo.addColumn("Horas Ex");//3
modelo.addColumn("SDN");//4
modelo.addColumn("Salario");//5
modelo.addColumn("Importe");//6
modelo.addColumn("Subsidio");//7
modelo.addColumn("Imss");//8
modelo.addColumn("Infonavit");//9
modelo.addColumn("ISR");//10
modelo.addColumn("Pension");//11
modelo.addColumn("Prestamo");//12
modelo.addColumn("Deducciones");//13
modelo.addColumn("Percepciones");//14
modelo.addColumn("Neto Pagado");//15


while(res.next())
{
Object[] fila = new Object[2];

for (int i = 0; i<2; i++)
{
fila[i] = res.getObject(i+1);
}
modelo.addRow(fila);
}
}

for(int i = 0; i<modelo.getRowCount();i++)
{
for(int c = 2; c<modelo.getColumnCount(); c++)
{
modelo.setValueAt(0, i, c);
}
}

Responder
avatar
_CarlitoX_
AUTOR
26 de julio de 2010, 12:37 delete

Esto ultimo no se para que es...

for(int i = 0; i<modelo.getRowCount();i++) {
for(int c = 2; c<modelo.getColumnCount(); c++) {
modelo.setValueAt(0, i, c);
}
}

Tampoco se para que la condicion: jTable1.getModel()==Nuevomod

Al agregar un modelo a la tabla no veo necesario evaluar esa condicion, sin embargo si ya tienes una tabla swing creada en netbeans y quieres agregarla a un modelo hazlo con MiJTabla.setModel(modelo)

int fila = jTable1.rowAtPoint(evt.getPoint());
int columna = jTable1.columnAtPoint(evt.getPoint());
if ((fila > -1) && (columna > -1)) {
//Aquí puedes llamar el metodo
}

Ahora, tambien puedes hacer lo que quieres de la siguiente forma, creas el modelo como variable global

DefaultTableModel modelo = new DefaultTableModel();

llamas al metodo luego de iniciar los componentes, luego del "initComponents()"

public boolean isCellEditable (int fila, int columna) {
if (column == LaColumna) {return true;}
else {return false;}
jTable1.setModel(modelo)
}

Y por ultimo queda verificar las variables booleanas que resulten de la operacion, si aun no lo logras avisame y subo un ejemplo para que veas el funcionamiento completo de todo eso...

Responder
avatar
Jose Fermin
AUTOR
26 de julio de 2010, 16:31 delete

Gracias
Bueno lo primero q me decias para q era lo del for(...) es para llenar el resto de las columnas en cada fila en 0 y asi no aparesca las demas columnas y filas vacias que va de la columna 2 a la 15.
Con respecto a jTable1.getModel()==Nuevomod como te decia utilizo dos modelos y cada uno tiene columnas diferentes y datos diferentes por eso le puse la condicion aunq tambien pudo ser un else y ya

con respecto al metodo isCellEditable no me deja introducir el jtable.setmodel(modelo); sale unrecheable statement, ademas si vuelvo a llamar el modelo, y al iniciar los componentes esta me sale vacia y debe visualizar el otro modelo que llame mod este contiene los registros previamente guardados.

mi clase contiene todos los metodos para abrir y cerrar la conexion ademas de consultas, inserciones, modificacion y borrado hacia la bd, entonces desde mi jpanel solo mando a llamar uno de estos metodos en este caso el de consulta para un nuevo recibo, este se visualiza al pulsar el boton Nuevo, agregas fecha inicial y final de la nomina pulsas agregar, y te dejara introducir dias trabajados, hrs extra y el prestamo.
bueno gracias por tu ayuda

Responder
avatar
_CarlitoX_
AUTOR
26 de julio de 2010, 16:39 delete

Estamos para ayudar, en estos momentos me encuentro en el trabajo y se me hace dificil hacerme con un ejemplo, si quieres esperame hasta mañana que publique algo con respecto a esto en el blog, explicare paso por paso un ejemplo de como deshabilitar ciertas columnas y tambien hacerlas ineditables... Saludos

Responder
avatar
Jose Fermin
AUTOR
26 de julio de 2010, 17:21 delete

orale genial muchas gracias!! estare dandome la vuelta mañana

Responder
avatar
_CarlitoX_
AUTOR
27 de julio de 2010, 8:46 delete

Te invito a ver la nueva entrada, no me dio tiempo de hacerme con un ejemplo completo como queria pero publique una solución que creo que es lo que pasaba, no tenias una clase para el modelo, sino que utilizabas la que trae por defecto swing que de por si es editable, prueba y me comentas a ver que tal.. suerte!

Responder
avatar
Anónimo
AUTOR
2 de agosto de 2010, 12:09 delete

hola carlos me pueden ayudar con lo de isCellEditable es que la verda apenas estoi comenzando con java y pues no se donde ponerlo oks gracias

Responder
avatar
Anónimo
AUTOR
2 de agosto de 2010, 12:20 delete

Ke ondha pues kreoo0 que me sirvioo0o0 de muchoo0 el otro ejemplo que publicaste eh ya funcional el iscelleditable o0o0ks
gracias



ejemplo


DefaultTableModel modelo = new DefaultTableModel(){
@Override
public boolean isCellEditable (int fila, int columna) {
if (columna > 4)
return true;
return false;
}
};

Responder
avatar
_CarlitoX_
AUTOR
2 de agosto de 2010, 12:39 delete

De nada, cualquier otra cosa no dudes en preguntar

Responder
avatar
Anónimo
AUTOR
13 de agosto de 2010, 20:06 delete

Hola,
me pueden ayudar lo que pasa que necesito hacer una firma programada en html o en javascript la cual se pueda editar; es decir; que cuando abra el archivo solo me aparezca habilitado el nombre y el correo.. espero haberme explicado bien
espero tu respuesta
Saludos

Responder
avatar
_CarlitoX_
AUTOR
14 de agosto de 2010, 11:33 delete

esteeeeee.... mmmm... no, no entiendo... podrías replantear todo otra vez para entender mejor?

Responder
avatar
Anónimo
AUTOR
6 de septiembre de 2010, 15:06 delete

Hola!
MI problema es este:
Estoy programando en Netbeans, agregué un jTable de los componentes Swing de la Paleta, y en la propiedad Model, deshabilite la opción Editable, pero aún así cuando ejecuto mi programa, aún se pueden modificar los datos de las celdas.

Lleno mi tabla de la siguiente forma:
tengo una clase que se llama "consulta", en la cual tengo este método general que me sirve para llenar cualquier tabla a partir de un Resultset:

public DefaultTableModel Filltabla(ResultSet rss){
DefaultTableModel modelo = new DefaultTableModel();
try{
ResultSetMetaData MDatos = rss.getMetaData();
int ncol = MDatos.getColumnCount();
for (int i = 1; i <= ncol; i++) {
modelo.addColumn(MDatos.getColumnLabel(i));
}

while (rss.next()) {
Object[] row = new Object[ncol];
for (int i = 0; i < ncol; i++) {
row[i] = rss.getObject(i + 1);
}
modelo.addRow(row);
}
}
catch (SQLException ex) {
Logger.getLogger(consulta.class.getName()).log(Level.SEVERE, null, ex);
}
return modelo;
}



y desde mi jFrame, lo mando llamar así:

consulta obj=null;
ResultSet rs=null;

rs = obj.listaEstilos(); //consulta estilos
jTable1.setModel(obj.Filltabla(rs));


quisiera que me ayudaras a implementar tu método para hacer que las celdas no sean editables, gracias!

Responder
avatar
_CarlitoX_
AUTOR
7 de septiembre de 2010, 8:57 delete

Primero que nada disculpa la tardanza, no había abierto el correo desde ayer a las 5, me parece bastante bien que utilices un método para llenar la tabla según la consulta que supongo es del tipo SQL, bueno, eso no viene al caso, verás, estas utilizando un "DefaultTableModel" y a este modelo si no se le pasan parámetros es básico.

De cualquier forma utiliza el método "isCellEditable" en la declaración del modelo:
jTable no Editable

En esa entrada explico como hacerlo ya que surgen muchas dudas con respecto al tema, si tienes problemas no dudes en consultar.

Responder
avatar
Anónimo
AUTOR
7 de septiembre de 2010, 15:12 delete

Gracias por responder!
ahora mi método quedo de la siguiente manera:

public DefaultTableModel Filltabla(ResultSet rss){
DefaultTableModel modelo = new DefaultTableModel(){
@Override
public boolean isCellEditable (int fila, int columna) {
if (columna > 4)
return true;
return false;
}
};
try{
ResultSetMetaData MDatos = rss.getMetaData();
int ncol = MDatos.getColumnCount();


for (int i = 1; i <= ncol; i++) {
modelo.addColumn(MDatos.getColumnLabel(i));
}

while (rss.next()) {
Object[] row = new Object[ncol];
for (int i = 0; i < ncol; i++) {
row[i] = rss.getObject(i + 1);
}
modelo.addRow(row);
}
}
catch (SQLException ex) {
Logger.getLogger(consulta.class.getName()).log(Level.SEVERE, null, ex);
}
return modelo;
}


y ya me funcionó!!!
Thanks a lot!
XD

Responder
avatar
_CarlitoX_
AUTOR
7 de septiembre de 2010, 16:44 delete

Repito, me parece buenísimo que utilices un resulset en una función para llamarlo en distintas consultas sql... Y no hay problema, cualquier duda planteala que aquí se le da una solución.

Responder
avatar
Anónimo
AUTOR
8 de septiembre de 2010, 10:43 delete

Ok, gracias _CarlitoX_
y me gustaría plantear otra duda

tengo una pantalla de login, en la cual tengo dos textfield (para el usuario y el pass) y quiero hacer que hasta que esos 2 textfield contengan algo, el botón se habilite, de otra forma no.

Espero me puedas ayudar con esto también

Responder
avatar
_CarlitoX_
AUTOR
8 de septiembre de 2010, 16:35 delete

Coloca una condición en en evento del tipo "onKeyPress" para que cuando el usuario presione una tecla y ese textfield's no estén vacíos se habiliten... dejame publicarte un ejemplo en una nueva entrada

EDITO: ya he publicado el ejemplo: "LogIn en Java"

Responder
avatar
Anónimo
AUTOR
15 de septiembre de 2010, 14:50 delete

estoy intentando deshabilitar ciertas celdas en un jtable pero con el metodo de iscelleditable no he podido. como hago?

Responder
avatar
Anónimo
AUTOR
15 de septiembre de 2010, 14:53 delete

si puedes por favor respondeme a este email... ahernandez@ms2.com.ve

Responder
avatar
_CarlitoX_
AUTOR
15 de septiembre de 2010, 15:59 delete

Como dije anteriormente... puedes probar lo de la siguiente entrada: "JTable no Editable".

Responder
avatar
Anónimo
AUTOR
7 de febrero de 2011, 15:29 delete

Hola Carlitox me parece una genialidad tu blog.. realmente te felicito.
Tengo un problema y no se si puedas darme una mano, mira lo que pasa es que estoy creando un programa en java que realiza una consulta a una base de datos (MySQL) mediante un mouseClicked y exponerlas en forma grafica medante JTable el problema radica en que necesito usar uno de los datos tomados para realizar otra consulta en otra tabla y a traves de otro mouseClicked poder tomar este ultimo valor para modificarlo borrarlo etc... pero al hacer clic en la segunda Jtable se me cambian los valores lo cual es confuso y no se que es lo que esta pasando y como solucionarlo. Espero haberme podido explicar con todo este es el pedazo del codigo al cual me refiero:
personal = bdp.getpersonal();
//Primera Tabla
Object[][] data = new Object[personal.length][3];
for (int pe=0;pe -1) && (columna > -1)){
personal1 = bdp.getPersonalByNumper(
Integer.valueOf((String.valueOf(tablaPersonal.getV alueAt(fila,0)))));
textId.setText(String.valueOf(personal1.getNumper( )));
textId1.setText(String.valueOf(personal1.getNumper ()));
textNombres.setText(personal1.getNombres());
textApellidos.setText(personal1.getApellidos());
System.out.println(modeloTabla.getValueAt(fila,0)) ;

//Segunda tabla
int numper=Integer.parseInt(textId1.getText());
cargofuncion = bdcf.getCargoFuncion(numper);
Object[][] dataC = new Object[cargofuncion.length][3];
for (int pe=0;pe<cargofuncion.length;pe++){
dataC[pe][0]=cargofuncion[pe].getNombreCargo();
dataC[pe][1]=cargofuncion[pe].getDescCargo();
dataC[pe][2]=cargofuncion[pe].getNumper().getNumper();
}

String[] columNamesC = {"Nombre Cargo","Descripcion Cargo"};
modeloTablaCargo= new DefaultTableModel(dataC, columNamesC);
tablaCargo = new JTable(modeloTablaCargo);
tablaCargo.setPreferredScrollableViewportSize(new Dimension(500, 150));
scrollPanelCargo = new JScrollPane(tablaCargo);
int xx=100;
int yy=80;
scrollPanelCargo.setBounds(xx, yy, 1000, 150);
panelCargo.add(scrollPanelCargo);

estado = 3;
alterarEstado();
}
}
});

De antemano muchas gracias por tu tiempo

Responder
avatar
7 de febrero de 2011, 17:00 delete

Hola, bueno, lo primero que me parece es que con esto rellenas los datos, mas no me muestras el evento que manejan dichos datos... he de suponer que "bdp" es una clase y "getpersonal()" es un método, entonces tienes "bdp.getpersonal()" para obtener la lista de tu personal (supongo es para una empresa, nomina o algo así).

Ahora, he de decirte que si utilizas MySQL me gustaria ver como tienes esos datos guardados ya que estas complicando mucho algo muy simple, por ejemplo, tengo en la BD la tabla "persona", los campos:

ID / Nombre / Apellido / C.I / Dirección / Telf

El id es para identificar a cada empleado, en caso de que exista un segundo carlos, por ejemplo. Ahora, lo primero es definir las tablas y modelos para cada una:

Object [] columnas1 = {"ID","Nombre","Apellido","C.I."};
DefaultTableModel modelo1 = new DefaultTableModel(columnas1,0)
{@Override //para que no editar celdas
public boolean isCellEditable (int fila, int columna) {
return false;
}
};

Object [] columnas2 = {"Dirección","Telf"};
DefaultTableModel modelo2 = new DefaultTableModel(columnas2,0)
{@Override //para que no editar celdas
public boolean isCellEditable (int fila, int columna) {
return false;
}
};

Luego relleno la tabla uno automáticamente con todos los nombres:

void Carga(){
String busqueda= "SELECT nombre,apellido,ci FROM empleados";
//aqui cargo los datos y los subo a la tabla1
ResultSet resultado = stat.executeQuery (busqueda);
ResultSetMetaData metaDatos = resultado.getMetaData();
numeroColumnas = metaDatos.getColumnCount();
while (resultado.next()) {
Object [] fila = new Object[numeroColumnas];
for (int i=0;i<numeroColumnas;i++) {
fila[i] = resultado.getObject(i+1);
}
modelo1.addRow(fila);
}
}

Luego al hacer click en cualquier nombre, apellido o CI selecciono el ID de la fila donde hice click y vuelvo a repetir el proceso, solo que esta vez buscando el Telf y Dirección para llenarlos en la segunda tabla:

void CargaClick(){
String busqueda= "SELECT direccion,telf FROM empleados";
//aqui cargo los datos y los subo a la tabla2
ResultSet resultado = stat.executeQuery (busqueda);
ResultSetMetaData metaDatos = resultado.getMetaData();
numeroColumnas = metaDatos.getColumnCount();
while (resultado.next()) {
Object [] fila = new Object[numeroColumnas];
for (int i=0;i<numeroColumnas;i++) {
fila[i] = resultado.getObject(i+1);
}
modelo2.addRow(fila);
}
}

Espero esto pueda ayudarte, también me gustaría que me mostraras el evento click de las tablas y el método donde cargas la consulta SQL para poder ayudarte mejor, saludos!

Responder
avatar
Anónimo
AUTOR
7 de febrero de 2011, 20:55 delete

Hola nuevamente sabes q si me ayuda lo que me acabas de decir pero aun me quedan muchas dudas, como puedeo enviarte de manera mas personal el proyecto que estoy realizando para que puedas entenderme mejor.
Muchas gracias

Responder
avatar
8 de febrero de 2011, 8:11 delete

Me alegra haberte ayudado por mas poco que fuera, y bueno, en la parte derecha encontraras mi correo, justo donde dice "suscríbete al blog"...

Responder
avatar
Anónimo
AUTOR
11 de agosto de 2011, 15:28 delete

hola me gustaria saver si es posible hacer lo siguiente, los q han trabajdo con vb6.0 recordaran la grilla puede tener n columnas digamos 20 pero solo visualizo digamos unas 5 las demas van apareciendo a medida q muevo el scroll es eso posible hacer en un jtable

Responder
avatar
Anónimo
AUTOR
3 de noviembre de 2011, 23:20 delete

hola como estas tengo una pregunta Carlitox lo que pasa es que yo trabajando en netbenas y e creado una tabla tipo (jTable) le e puesto el boton de chulear como ago para crear un boton que cuando selecciones en la tabla el elimine el que an seleccionado porfavor repondeme lo mas rapido grax por su atencion

Responder
avatar
4 de noviembre de 2011, 7:42 delete

Hola, ¿como estas?...... Bueno, primero que nada lo ideal seria construirte el modelo, pero como ya tienes la tabla debes setearlo....

Crea la variable:

DefaultTableModel modelo = new DefaultTableModel();

Busca en tu código "initComponents()", justo debajo de eso colocas:

jTable1.setModel(modelo);

Luego en el evento del botón:

modelo.removeRow(laFila);

Eso es todo, saludos!

Responder
avatar
Anónimo
AUTOR
4 de noviembre de 2011, 13:39 delete

men muchas grax por tu atencion mira yo yatengo creado todo el modelo y todo para resumir lo unico que me falta es lo del boton borrar la fila cuando me seleccionan la fila entiendo todo lo que me respondiste pero no entiendo lo que esta en parentesis al final lo de laFila de donde saco eso ? grax por su atencion

Responder
avatar
4 de noviembre de 2011, 13:47 delete

Lo de la fila lo tienes con el mouse clicked, que esta explicado mas arriba en el post, es decir...

Declara una variable int global:
int fila = 0;

Dale click derecho a tu tabla y agrega el evento MouseClicked, en el pones lo siguiente:

int fila = tabla.rowAtPoint(evt.getPoint());

Ahora en el evento del botón pones:

modelo.removeRow(fila);

Responder
avatar
Anónimo
AUTOR
9 de noviembre de 2011, 11:58 delete

muchas grax men lla lo tengo seria mucha molestia si le pido un favor mas el ultimo sera selojuro ;D

loquepasa es que yo estoy guardando en una lista unos datos X y los ago reflejar en el jTable ya tengo los botones de borrar los de agregar pero cuando yo selecciono uno en expecifico para borrar que tenga datos ps borra la fila pero cuando le doy actualizar a la jTable ps aprese denuevo los datos q se supone que e borrado aprese porq los borre temporalmente del jTable pero no de la lista la pregunta es:

cuando seleccione una fila, como ago para borrarla y que por hay derecho se borre tambien los datos de la lista ??? espero que alla sido concreto y claro grax por su atención...

Responder
avatar
9 de noviembre de 2011, 13:28 delete

Pues eso depende.... Si los cargas desde una base de datos pues tendras que borrar el registro, si es desde un archivo (ya sea texto plano o no) tendras que borrarlo de ese archivo, todo depende de donde recuperes esos datos.... Tienes 2 opciones:

1. Actualizar el archivo, tabla o cualquiera de estos borrando únicamente el registro que eliminas de la tabla.

2. Borrar todo de la tabla o archivo y guardar de nuevo todos los elementos de la lista, para luego mostrar los datos actualizados.

Te recomiendo que hagas lo primero, si bien lo segundo es mas simple, es menos estético y va contra todo lo que es "el deber ser".... Saludos!

Responder
avatar
Anónimo
AUTOR
9 de febrero de 2012, 22:06 delete

carlitox esta super interesante tu blog me llamo david y mi pregunta es la sgte como programo un campo de progreso...bueno mi idea es la sgte tengo mi tabla de login para usuarios lo que quisiera que haga es cuando los usuarios se logeen todo salga el cuadrito de progreso que ingresando al sistema y luego lo usual bienvenidos al sistema y se desplasa la tabla de menu ya le di muchas vueltas espero me puedas ayudar ahh es netbeans mi correo es panzer_demolition@hotmail.com... y gracias de ante mano

Responder
avatar
10 de febrero de 2012, 7:51 delete

Hola david, lo que necesitas aún no lo he publicado, esta atento al blog que pronto lo publicaré.

Responder
avatar
Anónimo
AUTOR
21 de agosto de 2012, 3:56 delete

Hola Carlitox me llamo Andriy me podrias ayuda a implementar el metodo de (Cel·lda no editable).
En este metodo me devuelve un JTable entonses no se como deberia de ir.
Veras lo que quiero es que la tabla este bloqueada por completo, pero hay una pega y es que tengo funcionando un MouseListener que me gustaria que siguese funcionando mientras la JTable no es editable.


public static JTable ListarArticulos (){
DefaultTableModel modelo=new DefaultTableModel();
tecnics objart=new tecnics();
ArrayList lista2=new ArrayList();
lista2=objart.ListaArticulos();
//Titulos de Columnas de la Tabla
modelo.addColumn("Nif");
modelo.addColumn("Cognom i Nom");
modelo.addColumn("Carrer");
modelo.addColumn("Numero");
modelo.addColumn("Escala");
modelo.addColumn("Pis");
modelo.addColumn("Porta");
modelo.addColumn("CP");
modelo.addColumn("Localitat");
modelo.addColumn("Telefon");
modelo.addColumn("E-mail");
modelo.setRowCount(lista2.size());
int i=0;
//Coloca en la tabla los datos de BD
for (tecnics x : lista2)
{
modelo.setValueAt(x.getNif(), i, 0);
modelo.setValueAt(x.getCognomnom(), i, 1);
modelo.setValueAt(x.getCarrer(), i, 2);
modelo.setValueAt(x.getNumero(), i, 3);
modelo.setValueAt(x.getEscala(), i, 4);
modelo.setValueAt(x.getPiso(), i, 5);
modelo.setValueAt(x.getPorta(), i, 6);
modelo.setValueAt(x.getCp(), i, 7);
modelo.setValueAt(x.getLocalitat(), i, 8);
modelo.setValueAt(x.getTelefon(), i, 9);
modelo.setValueAt(x.getEmail(), i,10);
i++;
}
//2 siguentes linias para colocar barra de deslasamiento Horizontal
tabla.setModel(modelo);
tabla.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tabla.doLayout();
tabla.setFont(new Font("Arial",1,12));
tabla.setForeground(Color.darkGray);
tabla.getTableHeader().setFont(newFont("Arial",1,12)) tabla.getTableHeader().setForeground(Color.WHITE); tabla.getTableHeader().setBackground(Color.BLUE);

return tabla;
}

Responder
avatar
21 de agosto de 2012, 9:39 delete

Revisa la entrada http://carlitoxenlaweb.blogspot.com/2010/07/jtable-no-editable.html, de cualquier forma reemplaza esto:

DefaultTableModel modelo=new DefaultTableModel();

Por esto:

DefaultTableModel modelo = new DefaultTableModel()
{@Override
public boolean isCellEditable (int fila, int columna) {
return false;
}
};

Responder
avatar
Anónimo
AUTOR
22 de agosto de 2012, 3:43 delete

Muchisimas gracias! :) vi tu entrada antes per no me di cuenta que me faltaba el ";" jaja una ultima duda se pueden bloquear las columnas de la table ? Para que la gente no mueva sin querer una columna entra y despues diga "eso no va ahi me lo han cambiado" muchas gracias de nuevo :)

Responder
avatar
22 de agosto de 2012, 8:44 delete

No hay de que, y claro que se puede, solo debes obtener el encabezado y deshabilitarlo, para ello haces lo siguiente:

tabla.getTableHeader().setReorderingAllowed(false);

Responder
avatar
Anónimo
AUTOR
23 de agosto de 2012, 4:17 delete

Buaahh muchisimas gracias de verdad :)!!

Responder
avatar
18 de abril de 2013, 22:30 delete

como puedo mostrar un dato al seleccionar en un jtable y mostrar en un jtexfiel urgente necesito ayuda

Responder
avatar
18 de abril de 2013, 22:31 delete

como puedo mostrar un dato al seleccionar en un jtable y mostrar en un jtexfiel urgente necesito ayuda

Responder
avatar
20 de abril de 2013, 18:00 delete

Lee bien el post, dice claramente... "Obtener el valor donde se hace click.", solo te resta mostrarlo en la caja de texto con "setText()".....

Responder
avatar
Anónimo
AUTOR
12 de junio de 2013, 13:01 delete

Buen Blog mi viejo, ahora tengo una inquietud y esta radica en:

Dentro de un JTable ingreso dos datos uno es nombre y el otro cedula. Como puedo hacer para que no se me repita el dato al darle en el botón ingresar?

Responder
avatar
12 de junio de 2013, 14:03 delete

Postea tu código y veamos como lo haces, a de haber algo extraño por ahi.....

Responder
avatar
Anónimo
AUTOR
14 de junio de 2013, 9:41 delete

private void btningresarActionPerformed(java.awt.event.ActionEvent evt) {
DefaultTableModel modelo = (DefaultTableModel) jtdatosempleado.getModel();

String nom = String.valueOf(cmbempleado.getSelectedItem());

int index=cmbempleado.getSelectedIndex();
String ced[]=c.getEmpleado1();
/*jtdatosempleado.setValueAt(nom,xxx, 0);
jtdatosempleado.setValueAt(ced[index],xxx, 1);*/
xxx++;

String [] datos ={nom,ced[index]};
modelo.addRow(datos);
}

private void btnaceptarActionPerformed(java.awt.event.ActionEvent evt) {
int n = jtdatosempleado.getRowCount();
if (n == 0) {
JOptionPane.showMessageDialog(null, "No existe ninguna fila en la tabla");
return;
}
String nombre;
String cedula;
String Consec = txtconsec.getText();
String Fecha=txtfecha.getText();
String Solicitud = String.valueOf(cmbsolicitud.getSelectedItem());
String Cantidad = txtcantidad.getText();
String HInicio =String.valueOf(cmbhini.getSelectedItem());
String MInicio =String.valueOf(cmbmini.getSelectedItem());
HInicio=HInicio +":"+ MInicio;
String HFin =String.valueOf(cmbhfin.getSelectedItem());
String MFin =String.valueOf(cmbmfin.getSelectedItem());
HFin=HFin +":"+ MFin;
String Area = String.valueOf(cmbarea.getSelectedItem());
String Desc = txtajustif.getText();
String Solicita = String.valueOf(cmbsolicita.getSelectedItem());

for (int i = 0; i < n; i++) {
nombre = jtdatosempleado.getValueAt(i, 0).toString();
System.out.println(nombre);
cedula = jtdatosempleado.getValueAt(i, 1).toString();
System.out.println(cedula);
//c.IngRefrigerios(Solicitud, Solicitud, Solicitud, Cantidad, HInicio, Solicita, Area, MInicio, Solicita, Area, cedula, Desc, Solicita);
c.IngRefrigerios(Consec,Fecha, Solicitud, Cantidad, HInicio, HFin, Area, nombre, cedula, Desc, Solicita);

}
JOptionPane.showMessageDialog(null, "Los Datos fueron Agregados Correctamente");
String consec = c.getvalidrefri();
txtconsec.setText(consec);
limpiarTabla(jtdatosempleado);
}

private void btncancelarActionPerformed(java.awt.event.ActionEvent evt) {
int consec1 = Integer.parseInt(txtconsec.getText());
consec1=consec1-1;
c.getactvalidrefri(consec1);
System.exit(0);
}
El btnaceptar los ingresa al jtable (nombre del empleado y cedula) y el btningresar los agrega a la bd. La verdad no se como puedo realizar esa parte para que cuando seleccione un empleado y lo ingrese a la tb no lo pueda ingresar nuevamente. Me colaboras.....

Responder
avatar
john jairo sanchez
AUTOR
14 de junio de 2013, 9:44 delete

Carlos buen día. Me puedes brindar una asesoria???. Quisiera tener en un jtable mas de 100 filas pero solo tiene predeterminadas 100. Se puede ampliar a 500 o 1000 filas por decir algo??? Y si es asi como lo haría. Gracias de antemano

Responder
avatar
14 de junio de 2013, 9:48 delete

Lo que tienes es un problema de validación, tienes que comparar lo que envias con lo que tienes, entonces lo que debes hacer es crear un método que valide el cliente que quieres ingresar para ver si ya existe en la BD, y que el método devuelva "true" o "false" según el resultado.....

Para la conexión puedes leer esto:
http://carlitoxenlaweb.blogspot.com/2008/12/conectando-java-con-mysql.html
http://carlitoxenlaweb.blogspot.com/2011/09/consultas-sql-dinamicas-en-java.html

Otra buena practica seria depurar ese código, por ejemplo, la declaración de todos esos Strings, podrías cambiarlo a:

String nombre,
cedula,
Consec = txtconsec.getText(),
..... ;

Fijate que las variables las separas con "comas" y la última la terminas en "punto y coma".... Saludos!!

Responder
avatar
14 de junio de 2013, 9:50 delete

Lo ideal es que limites y muestres las filas con botones de siguiente y anterior..... Atento a la nueva entrada que explicare como hacerlo, gracias por preguntar...... Saludos!!

Responder
avatar
Anónimo
AUTOR
14 de junio de 2013, 10:06 delete

Carlos tal vez no me he hecho entender. La conexión con la base de datos funciona e ingresa los datos correctamente, adicional a esto dentro de la base de datos en la tabla donde se ingresan los registros existe un unique que no permite ingresar más de una vez una ced y nomb perteneciente al consecutivo. Eso funciona correctamente. Lo que deseo es que el jtable de la interfaz no existan datos repetidos es decir si del cmb selecciono Carlos Martinez con ced 123456 y le doy ingresar para que lo muestre en el jtable, ya no pueda volver a ingresarlo en ese jtable con ese mismo consecutivo. Me hago entender?

Responder
avatar
14 de junio de 2013, 10:16 delete

Exacto, es como te acabo de decir, necesitas validar que el campo ya existe a nivel de programa, no a nivel de BD, o manejar una excepción que le diga al programa que si hay un error por duplicidad en la BD no agregue el registro a la tabla.....

Si tu cargas los registros de la tabla por SQL entonces necesitas esa validación, que si el registro existe no lo agregue (a nivel de programa), y si los agregas mediante otro tipo de dato debes leer los registros de la tabla y ver si ya esta para no repetirlo, en ningún momento haz puesto esta validación al momento de agregar la fila..... Me entiendes?

Responder
avatar
KeviNXiToO!
AUTOR
29 de agosto de 2013, 2:04 delete

Hola me podrias ayudar con un ejercicio tipo para poder agregar datos a una tabla sin que se repitan, por ejemplo si existe un DNI de una persona solo se agregue una vez. Porfavor soy algo nuevo en Java Netbeans. Gracias

Responder
avatar
29 de agosto de 2013, 9:01 delete

Si es así debes almacenar cada valor en una lista o array, como gustes, luego, cada vez que ingreses el valor, debes recorrer esos datos almacenados uno a uno y revisar que no exista, si no existe entonces lo agregas, sino lo omites... Busca aquí en el blog las entradas de listas, arrays y tablas, de esta forma tendrás una idea mas general... Saludos!!

Responder
avatar
Anónimo
AUTOR
2 de octubre de 2013, 18:54 delete

Estoy trabajando con un proyecto para crear horarios y estoy utilizando el JTable, pero necesito validar que si por ejemplo, un curso se está dando en el aula 13, cuando quiera ingresar un nueva informacion y que digite que quiero dar ese curso en el aula 13 no me lo permita porque esta ocupado, que me muestre un mensaje.. Gracias, necesito esa ayuda

Responder
avatar
30 de octubre de 2013, 6:08 delete

Necesitas conectarte a MySQL antes de guardar el campo, utiliza el buscador ubicado en la esquina superior derecha del blog, te oriento un poco...

1. Crea una función donde se valide la data ingresada
2. Valida si el campo donde se esta ingresado no esta ocupado (aula)
3. De estar vacío procede a llenar esa info y actualiza la tabla

Como verás, necesitas solo una función donde se valide la data, repito, utiliza el buscador que la info esta.....

Responder
avatar
Anónimo
AUTOR
30 de junio de 2014, 11:01 delete

Muy buen post.
Estoy teniendo un problema y quería saber si me podés ayudar.
Tengo un jTable con 3 columnas: codigo,descripcion,cantidad.
La idea es que cada vez que carga el código, lo busca en la BD y trae la descripción y me pone cantidad en 1.
Hasta ahi bien.
El problema surge cuando vuelvo a ingresar el mismo codigo. Me debería incrementar la cantidad en el producto con ese codigo pero sin agregar una nueva fila(es decir, como si agrupara).
Me podrás ayudar con eso?? por favor...

Muchisimas gracias.

Responder
avatar
2 de julio de 2014, 11:17 delete

Claro, veamos tu código...... Se me ocurre que si encuentras la coincidencia omitas el insert de la fila

Responder
avatar
linda
AUTOR
24 de julio de 2014, 10:54 delete

hola, alguien me puede ayuar porfavor??? tengo q Hacer un programa donde se llene manualmente un ArrayList con nombres y sueldos al pulsar un botón. Luego en enviar este ArrayList a un método que colocara esta data en un JTable, mostrando así los datos en la pantalla.

Responder
avatar
24 de julio de 2014, 11:42 delete

Hola, pues en el blog hay muchos ejemplos de lo que dices, lo del arreglo puedes verlo aquí: http://carlitoxenlaweb.blogspot.com/2008/08/arreglos-parte-4.html

Lo del ArrayList es cuestión de modificar un poco el código, por ejemplo
String nombres[]=new String [n] >> List nombres = new ArrayList() >> ArrayList nombres = new ArrayList()

Y lo de mostrarlo en una tabla aquí esta como llenarlo (en esta entrada), si quieres una paginación entonces aquí también lo tienes:
http://carlitoxenlaweb.blogspot.com/2013/06/jtable-con-paginacion.html

Si tienes problemas implementando el código puedes publicar un comentario con el mismo para darle la solución... Saludos!

Responder
avatar
Anónimo
AUTOR
6 de noviembre de 2014, 15:14 delete

amigo que codigo puedo usar en netbeans para que cuando agrego un numero de DNI no ingrese uno el mismo, que ya esta en el campo.. osea en poca palabra para que no m duplique el DNI

Responder
avatar
9 de noviembre de 2014, 10:57 delete

Pues solo tienes que buscar la coincidencia dentro de la tabla y omitir el registro si hay duplicidad....

Responder
avatar
19 de junio de 2015, 19:24 delete

hola,
mi botón listar me repite los datos registrados y solo quiero una sola vez y al presionar listar ya no me liste lo mismo

Responder
avatar
23 de junio de 2015, 2:15 delete

hola me podrias ayudar con mi codigo es que estoy haciendo una aplicacion socket en nethbeans tengo dos JTable al momento de eliminar un registro en la primera table del cliente y si se elimina, el problema esta en la tabla del servidor que se duplican los datos en ves de eliminarlo...

Responder
avatar
15 de agosto de 2015, 10:10 delete

Para ello tendrías que recorrer la tabla y si el registro existe omitirlo, en los comentarios un usuario pregunto sobre el mismo problema... Saludos!!

Responder
avatar
15 de agosto de 2015, 10:13 delete

Publica algo del código para poder darte una mano, pero de momentos suena a que el problema es que del lado del servidor no se esta ejecutando la función correspondiente para eliminar el registro.

Responder
avatar

Lamentablemente hay muchos usuarios en la red que han llegado al blog para escribir obscenidades, así que la moderación se hace necesaria. Recuerda utilizar un lenguaje correcto y espera a que sea aprobado.

Si necesitas publicar código haz click en "Conversión" para hacerlo legible.
ConversiónConversión EmoticonEmoticon