Ver Mensaje Individual
  #3 (permalink)  
Antiguo 21/09/2009, 09:23
Dulmiel
 
Fecha de Ingreso: agosto-2009
Mensajes: 25
Antigüedad: 14 años, 9 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);
}
}
}

}