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

Ayuda con jtable

Estas en el tema de Ayuda con jtable en el foro de Java en Foros del Web. Hola... Agradecería mucho si alguien me puede ayudar con un ejemplo para controlar lo que edito en las celdas de mi JTable. Tengo un JTable ...
  #1 (permalink)  
Antiguo 20/09/2009, 11:38
 
Fecha de Ingreso: agosto-2009
Mensajes: 25
Antigüedad: 14 años, 8 meses
Puntos: 0
Ayuda con jtable

Hola...
Agradecería mucho si alguien me puede ayudar con un ejemplo para controlar lo que edito en las celdas de mi JTable.

Tengo un JTable con 3 columnas: cantidad, codigo, detalle
y deseo controlar que al digitar cantidad solo admita números y que no permita
que la celda quede vacía, sino colocar un 1 en caso de que el usuario la deje vacia.

El Jtable es nuevo para mi y hacerlo en Java es un poco más complicado que en Visual Basic me parece. Por eso necesito ayuda....

Gracias.
  #2 (permalink)  
Antiguo 20/09/2009, 21:20
 
Fecha de Ingreso: diciembre-2006
Mensajes: 213
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Ayuda con jtable

mm bueno la verdad no he trabajado mucho con JTable pero si quisiera hacer eso, algo q se me ocurre en este momento es que en el campo donde quieres solo numeros cuando vas a guardar la informacion lo llevas a int en un try si ocurre una exepcion es porque o hay letras o signos, puedes mandar un mensaje que introduzca solo numeros y tener una bandera para que no guarde la informacion mientras no cumpla con los requisitos.
__________________
Solo se que nada se . . . Nirvana: Un Sentimiento Echo Realidad.
  #3 (permalink)  
Antiguo 21/09/2009, 09:23
 
Fecha de Ingreso: agosto-2009
Mensajes: 25
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Ayuda con jtable

Bueno investigando todo el día de ayer he encontrado que el JTable maneja sus propios editores para cada columna de acuerdo al tipo que nosotros le hayamos indicado... en mi caso la tabla consta de 3 columnas: cantidad, codigo, descripcion y las dos primeras son Short y la ultima es String. Pero estos editores no me controlan que lo que digite en cantidad sea un número es asi que he creado mi propio editor llamado EditorNumero. Ahora para pasarle el editor a la tabla escribo lo siguiente:

tabla.setDefaultEditor (Short.class, new EditorTabla());

Con esto indico a mi tabla que el editor va a afectar todas las columnas tipo Short.

Aquí les dejo el código por si a alguién le sirve... OK.

Y ahora mi siguiente reto es controlar que la cantidad ingresada no sea superior a la existente en mi base de datos... Si alguien puede ayudar seria excelente...

CODIGO DE CLASE EditorNumero

public class EditorNumero extends JTextField implements TableCellEditor{

private ArrayList<CellEditorListener> suscriptores = new ArrayList<CellEditorListener>();
/*************************************CONSTRUCTOR POR DEFECTO******************************/
public EditorNumero(){


//Nos apuntamos a la pérdida de foco, que quiere decir que se ha
// dejado de editar la celda.
this.addFocusListener(new FocusListener() {
public void focusGained (FocusEvent e) {
setText("");
}
public void focusLost (FocusEvent e)
{
editado (true);
}
});

//Nos apuntamos a un escuchador de tecla, para detectar si lo
//digitado es correcto. En nuestro caso es correcto si es número.
this.addKeyListener(new KeyAdapter(){
public void keyTyped(KeyEvent arg0) {
char caracter = arg0.getKeyChar();
if(((caracter < '0') || (caracter > '9')) && (caracter != KeyEvent.VK_BACK_SPACE))
arg0.consume(); // ignorar el evento de teclado
}
});
}

/*******************************METODOS PARA MANEJO DE SUSCRIPTORES************************/
public void addCellEditorListener(CellEditorListener l) {
suscriptores.add(l);
}

public void removeCellEditorListener(CellEditorListener l) {
suscriptores.remove(l);
}

/*******************************METODOS PARA CANCELAR Y TERMINAR EDICION************************/

/**Le dice al editor que cancele la edición y
* no aceptar ningún valor editado parcialmente*/
public void cancelCellEditing() {
}

/**Le dice al editor para detener la edición y aceptar cualquier valor
* parcialmente editado como el valor del editor. El editor retorna
* falso si la edición no se detuvo, lo que es útil para los editores
* que validen y no puede aceptar entradas inválidas.
*
* @ return true si la edición fue detenida, false en caso contrario*/
public boolean stopCellEditing() {
//indica si se puede detener la edición
return true;
}

/*******************************OTROS METODOS DE EDICION************************/

/**Retorna el valor contenido en el editor*/
public Object getCellEditorValue() {
return Short.parseShort(this.getText());
}

/**Retorna el componente utilizado como editor*/
public Component getTableCellEditorComponent(JTable t, Object value,
boolean isSelected, int fila, int columna) {
if(isSelected)
this.setBackground(Color.YELLOW);
else
this.setBackground(Color.WHITE);
return this;
}


public boolean isCellEditable(EventObject e) {
//la celda es editable ante cualquier evento
return true;
}

public boolean shouldSelectCell(EventObject arg0) {
//indica si al editar la celda, debemos seleccionar
//la fila que la contiene
return true;
}

/*******************************MIS METODOS DE EDICION************************/
/**
* Si cambiado es true, se avisa a los suscriptores de que se ha terminado
* la edición. Si es false, se avisa de que se ha cancelado la edición.
*/
protected void editado(boolean cambiado)
{
ChangeEvent evento = new ChangeEvent (this);
int i;
for (i=0; i<suscriptores.size(); i++)
{
CellEditorListener aux = (CellEditorListener)suscriptores.get(i);
if ((cambiado==true)&&(this.getText().isEmpty()==fals e)){
aux.editingStopped(evento);
}
else{
aux.editingCanceled(evento);
}
}
}

}
  #4 (permalink)  
Antiguo 21/09/2009, 18:20
Avatar de FiruzzZ  
Fecha de Ingreso: diciembre-2007
Ubicación: en casa
Mensajes: 470
Antigüedad: 16 años, 4 meses
Puntos: 41
Respuesta: Ayuda con jtable

planteá tus dudas en menos de 4 renglones y te ayudo...
Sé hacer cualquiera cosa con jTables, models, Default..Columns, Renders, DataType
  #5 (permalink)  
Antiguo 22/09/2009, 16:29
 
Fecha de Ingreso: agosto-2009
Mensajes: 25
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Ayuda con jtable

Cita:
Iniciado por FiruzzZ Ver Mensaje
planteá tus dudas en menos de 4 renglones y te ayudo...
Sé hacer cualquiera cosa con jTables, models, Default..Columns, Renders, DataType
Hi! Tengo un JTable que viene a ser el detalle de una factura por lo que tiene 3 columnas: CODIGO, DETALLE, CANTIDAD. Necesito controlar que la cantidad digitada no sea superior a la existente en el campo stock de mi tabla producto.
  #6 (permalink)  
Antiguo 22/09/2009, 19:30
Avatar de FiruzzZ  
Fecha de Ingreso: diciembre-2007
Ubicación: en casa
Mensajes: 470
Antigüedad: 16 años, 4 meses
Puntos: 41
Respuesta: Ayuda con jtable

La cosa sería..
Ir armando el detalle de la factura "editando" las celdas de la jTable.. si es así como te planteaste el funcionamiento, te complicaste bastante..
Normalmente siempre arriba de la tabla..
hay un buscador de "producto" (TextField codProducto, Nombre y otro para cantidad) el cual seleccionás y le das la cantidad.. y antes de insertar/agregar la nueva fila en la Tabla para IR FORMANDO el detalle, hacés el controDeStock()..
Sinó vas a tener que usar los Event->Mouse o un Listener para saber en q fila y columna se está efectuando el cambio y validarlo antes de setearlo.
  #7 (permalink)  
Antiguo 22/09/2009, 21:10
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Mensaje Respuesta: Ayuda con jtable

Hola,

Como menciona FiruzzZ es más complicado de esa forma .... pero posiblemente sea de alguna ayuda ...

Código Java:
Ver original
  1. jTextField1.setInputVerifier(new ClientVerifier());

Código Java:
Ver original
  1. private class ClientVerifier extends javax.swing.InputVerifier {
  2.        
  3.         public boolean verify(javax.swing.JComponent input) {
  4.             if(jTextField1.getText().length() > 0) {
  5.                 if(!Search()) {
  6.                 // <-- BUSCAR EL CODIGO DEL CLIENTE EN EL DBMS
  7.                     GalleryNewEvent result = AddNew();
  8.                     // <-- SI NO EXISTE ABRIR UN FORMULARIO PARA AGREGARLO AL DBMS
  9.                     if(result.getStatus() == GalleryNewEvent.STATUS.CANCEL) {
  10.                         return false;
  11.                     } else {
  12.                         jTextField1.setText(result.getNitcli());
  13.                         if(!Search()) {
  14.                             Clear();
  15.                             return false;
  16.                         }
  17.                     }
  18.                 }
  19.             }
  20.             return true;
  21.         }
  22.        
  23.     }

Básicamente se puede implementar un InputVerifier que vaya a la base de datos y extraiga mayor información, que se puede validar y devolver un valor bool para aceptar o no la entrada de datos. (La fila de edición actual se extrae directamente del JTable getSelectedRow() y del TableModel ... etc).

Saludos,
  #8 (permalink)  
Antiguo 22/09/2009, 21:33
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Mensaje Respuesta: Ayuda con jtable

Hola,

Otro caso podría ser en el momento de pasar los valores del JTable al TableModel, es decir, cuando el JTable finaliza la edición y pasa los valores al TableModel.

Aunque no observé ninguna implementación del TableModel, posiblemente sea de alguna ayuda ...

Código Java:
Ver original
  1. public class ClientTableModel extends AbstractTableModel {
  2. ....
  3.     public void setValueAt(Object value, int row, int col) {
  4.         if(value == null)
  5.             return;
  6.        
  7.         switch(col) {
  8.             case 0:
  9.                 if(!updateItem(value, row, col)) {
  10.                     String search = Search();
  11.                     if(search != null)
  12.                         updateItem(search, row, col);
  13.                 }
  14.                 totalField.setText(String.valueOf(getTotalValor()));
  15.                 fireTableCellUpdated(row, col);
  16.                 break;
  17. ...
  18.         }
  19.     }

Es decir, si en el método setValueAt() no se actualiza el modelo, es como si el valor nunca hubiera sido ingresado, al final ... la implementación es bastante compleja.

Saludos,
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 00:57.