Ejemplos java y C/linux

Tutoriales

Enlaces

Licencia

Creative Commons License
Esta obra está bajo una licencia de Creative Commons.
Para reconocer la autoría debes poner el enlace http://www.chuidiang.org

Cambiar el TableCellEditor de un JTable

Este ejemplo es continuación del ejemplo del modelo de datos del JTable. En aquel ejemplo, al hacer doble click sobre una celda, se podía cambiar el valor utilizando el editor por defecto para cada celda. El JTable sabe editar las clases normales de java (String, Integer, Boolean, etc). A vecés el dato (la clase) que hay en esa celda de la tabla no tiene un editor por defecto o símplemente no nos gusta. En este ejemplo vamos a ver cómo darle al JTable nuestro propio editor para la celda.

En este ejemplo cambiaremos el editor de edades del ejemplo del modelo mencionado anteriormente, de forma que en vez de ser un editor numérico por defecto, nos ponga un menú (un JComboBox) con tres opciones: "joven", "hombre" y "viejo". "joven" devolverá 15 años, "hombre" devolverá 33 y "viejo" 99.

El TableCellEditor

El editor de celdas puede ser cualquier Component java que queramos. Basta con hacer una clase que implemente la interface TableCellEditor y que devuelva en su método getTableCellEditorComponent() dicho componente. Debemos además implemetar otros métodos. Vamos a verlos.

class EditorTabla implements TableCellEditor
{
    ...
}

El JTable se suscribirá a nuestro editor para ser informado de cuando se termina la edición de la celda, bien porque se ha cambiado el valor, bien porque el usuario ha decidido cancelar la edición. Los métodos que hay que implementar relativos a este tema son:

public void addCellEditorListener(CellEditorListener l)
public void removeCellEditorListener(CellEditorListener l)

Para ello haremos como hicimos en el modelo. Nuestra clase tendrá una LinkedList como atributo a la que irá añadiendo los CellEditorListener que reciba y de donde los ira borrando cuando se le diga. Puedes ver los métodos en el fuente de EditorTabla.java

Hay otro dos métodos por los que el JTable avisa a nuestro editor de que debe terminar o cancelar la edición.

public boolean stopCellEditing()
public void cancelCellEditing()

En el primer método el JTable nos pregunta si se puede parar la edición. Habitualmente devolveremos true, aunque podemos devolver false si el usuario está introduciendo los datos y lo que lleva introducido hasta el momento no es válido. Por ejemplo, si la celda edita fechas y el usuario ha escrito 31 de Febrero, podemos devolver false para obligar a que lo termine de escribir bien. En nuestro ejemplo devolveremos true sin más.

En el cancelCellEditing() el JTable nos indica que debemos cancelar la edición, es decir, tirar lo que el usuario ha escrito. En nuestro ejemplo este método no hace nada.

Otros métodos que debemos definir son

Con esto están todos los métodos. Únicamente un detalle. Es nuestra responsabilidad avisar al JTable (a través de los suscriptores) de cuándo se termina la edición. Para ello, nos suscribimos en nuestro JComboBox a la selección de una opción y a la pérdida del foco.

En el primer caso, una vez seleccionada una opción en el JComboBox, avisarémos a los suscriptores CellEditorListener a través de su método editingStopped(). Esta llamada hará que el JTable nos pregunte el nuevo valor a través de getCellEditorValue() y lo pondrá en el modelo del JTable.

El segundo caso se da cuando el usuario abre el menú para seleccionar, pero pincha en otro lado sin haber seleccionado nada en el JComboBox. Lo consideraremos como cancelada la edición y llamaremos al método editingCanceled() de los CelEditorListener.

Otra pequeña tontería: tenemos la clase AbstractCellEditor que nos redefine ya algunos de estos métodos (toda la parte de suscripción/desuscripción) y nos facilita otros (el aviso a los suscriptores). Si hacemos que nuestra case herede de esta, nos ahorramos algo de trabajo.

Poner el editor en la tabla

Finalmente, para pasarle el editor a la tabla, basta llamar al método setDefaultEditor() del JTable. Hay que pasarle el tipo de clase para el que sirve este editor y el editor en sí mismo. En nuestro caso, como es para la columna de la edad cuyo dato es un Integer, haremos la llamada así:

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

Cuando el JTable le pregunte al modelo de datos ¿cuál es la clase de esta columna? a través del método getColumnClass() y este devuelva, en nuestro caso, Integer para la columna de la edad, el JTable utilizará el editor para Integer que acabamos de pasarle. Para las otras columnas nombre y apellido, que contienen String, utilizará el editor por defecto.

El ejemplo

Puedes ver todo esto funcionando con un applet o desde un programa suelto. Tines acceso a los fuentes para verlos con detalle.

Estadísticas y comentarios

Numero de visitas desde el 4 Feb 2007: