ari2020
(Cémo usar ablas (Los Tutoriales de Java ™> Crear una GUI con JFC / Swing> Usar componentes Swing)
Los Tut
‘mejoras introducidas en versiones posteriores y podrian usar tecnologia que ya no esté disponible.
Consuite las Notas de la versién de JDK para obtener informacion sobre nuevas funciones, mejoras y opciones
eliminadas o en desuso para todas las versiones de JOK.
toriales de Java se han escrito para JDK 8. Los ejemplos y practicas descritos en esta pagina no aprovechan las
Cémo usar tablas
Con ki
la sTab? cclase puede mostrar tablas de datos, opcionalmente permitiendo al usuatio editar los datos. 7rableno
contiene ni almacena en caché datos; Es simplemente una vista de sus datos, Aqui hay una imagen de una tabla tipica
que se muestra dentro de un panel de desplazamiento:
‘The Header contains
Column tabs
TEESE
‘Speed reading
Fach Cell splays Each Column displays
data ten tne «ype af data
Erresto de esta seccién le muestra cémo realizar algunas tareas comunes relacionadas con la tabla, Estos son los,
temas que cubre esta seccién:
Crear una tabla simple
Agregar una tabla a un contenedor
Establecer y cambiar anchos de columna
Selecciones de usuario
Crear un modelo de tabla
Escuchando los cambios de datos
Disparar eventos de cambio de datos
Conceptos: editores y renderizadores
Usar renderizadores personalizados
Especificacién de informacién sobre herramientas para celdas
Especificacién de informacién sobre herramientas para encabezados de columna
Ordenar y fitrar
Usar un cuadro combinado como editor
Usar otros editores
Uso de un editor para validar texto introducido por el usuario
Impresién
Ejemplos que usan tablas
Crear una tabla simple
Prueba esto:
1. Haga clic en el botén Iniciar para ejecutar Simp LeTab leDemousando Java ™ Web Start ( descargue
DK 7 0 posterior }. O, para compilar y ejecutar el ejemplo usted mismo, consulte el indice del
ejemplo
2, Haga clic en la celda que contiene “Snowboard”.
Se selecciona toda la primera fila, lo que indica que ha seleccionado los datos de Kathy Smith. Un
resaltado especial indica que la celda "Snowboard" es editable. Generalmente, comienza a editar una
celda de texto haciendo doble otic en ella
3, Posicione el cursor sobre "Nombre". Ahora presione el botén del mouse y arrastre hacia la derecha.
Como puede ver, los usuarios pueden reorganizar las columnas en las tablas.
4, Coloque el cursor justo a la derecha del encabezado de una columna, Ahora presione el bot6n del
mouse y arrastre hacia la derecha o izquierda.
La columna cambia de tamaiio y las otras columnas se ajustan para llenar el espacio restante,
5, Cambie el tamafio de la ventana que contiene la tabla para que sea mas grande de lo necesario para
mostrar la tabla completa,
hitpsildocs.orace.com/javaseftutorialuswinglcomponentstable htm 11202rri2020 (Cémo usar ablas (Los Tutoriales de Java ™> Crear una GUI con JFC / Swing> Usar componentes Swing)
‘Todas las celdas de la tabla se ensanchan y se expanden para llenar el espacio horizontal adicional.
Latabla en Sinpietabledemc. javadeclara los nombres de columna en una matriz de cadena:
Cadena [] columnNanes
Deporte”,
“W de aos",
'Vegetariano”
‘Sus datos se inicializan y almacenan en una matriz de objetos bidimensional
UC) datos
Kathy", "smith
Snosboard", nuevo entero (5), nuevo booleano (Fals0)},
{cJohn", "Doe",
eno", nuevo entero (3), nuevo booleano (verdadero)},
(Sue, "Negro",
‘Tejer", nuevo entero (2), nuevo booleano (Fals0)),
"Jane", “white”,
Velocidad de lectura”, nuevo entero (28), nuevo booleano (verdadero)},
Joe", "Brown",
Pool", nuevo entero (18), nuevo boolean (Fals0)}
objet
Pr
Luego, la tabla se construye utilizando estos datos y columnNames:
3Table table = new JTable (data, colunnNanes) ;
Hay dos 77a! econstructores que aceptan datos directamente ( simpleTablenemousa el primero)
+ stable (object [] []_rowbat
+ stable (Vector rowData, Ve
, Object {] colum
lonnvanes)
La ventaja de estos constructores es que son faciles de usar. Sin embargo, estos constructores también tienen
desventaias:
‘+ Autométicamente hacen que cada celda sea editable.
‘+ Tratan todos los tipos de datos de la misma manera (como cadenas). Por ejemplo, si una columna de la tabla
tiene Bool eandatos, la tabla puede mostrar los datos en una casilla de verificacién. Sin embargo, si utiliza
‘cualquiera de los dos JTaisleconstructores enumerados anteriormente, sus Booleandatos se muestran como
una cadena, Puede ver esta diferencia en la Vegetariancolumna de la figura anterior.
‘+ Requieren que coloque todos los datos de la tabla en una matriz o vector, lo que puede no ser apropiado para
algunos datos. Por ejemplo, si esta creando instancias de un conjunto de objetos de una base de datos, es
posible que desee consultar los objetos directamente por sus valores, en lugar de copiar todas sus valores en
una matriz o vector.
Si desea evitar estas restricciones, debe implementar su propio modelo de tabla, como se describe en Creacién de un
modelo de tabla
Agregar una tabla a un contenedor
Aqui hay un cédigo tipico para crear un panel de desplazamiento que sirve como contenedor para una tabla:
aScrollPane scrolipane = new 2ScrollPane (tabla);
table. setFillsViewportHeight (verdadero);
Las dos lineas en este fragmento hacen lo siguiente:
+E] uScro11Paneconstructor se invoca con un argumento que se refiere al objeto de la tabla. Esto crea un
panel de desplazamiento como contenedor para la tabla; la tabla se agrega autométicamente al contenedor,
+ JTable. set Fi lsViewportHeichtse invoca para establecer
la £i11sViewportHei ght propiedad, Cuando esta propiedad es trucla tabla, usa la altura completa del
contenedor, incluso sila tabla no tiene suficientes filas para usar todo el espacio vertical. Esto facilta el uso de
la tabla como un objetivo de arrastrar y soltar.
Elpanel de desplazamiento coloca automaticamente el encabezado de la tabla en la parte superior de la ventana
agrafica. Los nombres de las columnas permanecen visibles en la parte superior del area de visualizacién cuando se
desplazan los datos de la tabla.
hitpsildocs.orace.com/javaseftutorialuswingleomponentsitabe htm 21202rri2020 (Cémo usar ablas (Los Tutoriales de Java ™> Crear una GUI con JFC / Swing> Usar componentes Swing)
Si esta utlizando una tabla sin un panel de desplazamiento, debe obtener el componente del encabezado de la tabla y
colocarlo usted mismo. Por ejemplo:
container. setLayout (nuevo BorderLayout ());
container.add (table.getTableHeader (), BorderLayout.PAGE_START);
container.add (tabla, SorderLayout.CENTER);
Establecer y cambiar anchos de columna
De forma predeterminada, todas las columnas de una tabla comienzan con el mismo ancho y las columnas ocupan
automaticamente todo el ancho de la tabla. Cuando la tabla se vuelve mas ancha o mas angosta (lo que podria
suceder cuando el usuario cambia el tamafio de la ventana que contiene la tabla), todos los anchos de calumna
cambian adecuadamente,
Cuando el usuario cambia el tamafio de una columna arrastrando su borde derecho, entonces otras columnas deben
cambiar de tamaiio o el tamaiio de la tabla debe cambiar. De forma predeterminada, el tamaiio de la tabla sigue
siendo el mismo, y todas las columnas a la derecha del punto de arrastre cambbian de tamafio para acomodar ell
espacio agregado 0 eliminado de la columna a la izquierda del punto de arrastre.
Para personalizar los anchos de columna iniciales, puede invocar se -dWvidthen cada una de las columnas
de su tabla. Esto establece los anchos preferidos de las columnas y sus anchos relativos aproximados. Por ejemplo,
agregar el siguiente cédigo para Simpl eTabeDenohacer que su tercera columna sea mas grande que las otras.
columnas:
Tablecoluan column = null;
para (int i= @; i <8; 1 4+) ¢
colunn = table.getColunrModel (). getColumn (1);
si (i == 2) {
column.setPreferreddidth (108); // la tercera columna es més grande
} mas {
colunn.setPreferreddidth (58);
y
y
Como muestra el cédigo anterior, cada columna de una tabla esté representada por
un ?abLeCo!unobjeto. TabLeColumnproporciona métodos getter y setter para los anchos minimo, preferido y
maximo de una columna, asi como un método para obtener el ancho actual. Para ver un ejemplo de configuracién de
anchos de celdas en funcién de una aproximacién del espacio necesario para dibujar el contenido de las celdas,
consulte el initColumnsizesmétodo en Tab leRenderDemo. java.
Cuando el usuario cambia el tamatio explicitamente de las columnas, los anchos preferidos de las columnas se
establecen de tal manera que los tamafios especificados por el usuario se convierten en los nuevos anchos actuales
de las columnas . Sin embargo, cuando se cambia el tamafio de la tabla, generalmente porque la ventana ha
‘cambiado de tamaiio; los anchos preferidos de las columnas no cambian. En cambio, los anchos preferidos existentes
se usan para calcular nuevos anchos de columna para llenar el espacio disponible.
Puede cambiar el comportamiento de cambio de tamafio de una tabla invocando s2tautoxesizeMode.
Selecciones de usuario
En su configuracién predeterminada, una tabla admite una seleccién que consta de una o mas filas. El usuario puede
seleccionar un rango contiguo de filas 0 un conjunto arbitrario de flas. La Ultima celda que indicé el usuario obtiene
Una indicacién especial; En el aspecto Metal, la calda se describe. Esta colda se conoce como la seleccién principal ; a
veces se llama “la celda con el foco” o “la celda actual’,
El usuario usa el mouse y//o el teclado para realizar selecciones, como se describe en la siguiente tabla:
5 ‘Accion del ;
Operacién ose Accién del teclado
Seleccione una lt acer clic IFlecha arriba o flecha abajo.
sola fila
Extiende ta pyesione,
'seleccion yus y NAGa_ | shift-Up Arrow o Shift-Down Arrow.
Idlic 0 arrastre
‘contigua.
Isobre tas filas.
[Agregar filaa [Control-clic _|Mueva la seleccién principal con la flecha Control-Up 0 la
la seleccién / Ilecha Control-Down, luego use la barra espaciadora para
hitpsildocs.orace.com/javasefttorialuswinglcomponentsitable htm 31202rri2020 (Cémo usar tablas (Los Tutoriales de Java ™> Crear una GUI con JFC / Swing> Usar componentes Swing)
alternar lagregar a la seleccién o la barra Control-Space para
'seleccién de jalternar la seleccion de fila.
fila.
Para ver c6mo funcionan las selecciones, haga clic en el botén Iniciar para
ejecutar Tableselect ionDemousando Java ™ Web Start ( descargue JDK 7 0 posterior ). 0, para compilar y
ejecutar el ejemplo usted mismo, consulte el indice del ejemplo .
Este programa de ejemplo presenta la tabla familiar y permite al usuario manipular ciertas opciones de
JTable. También hay un panel de texto que registra los eventos de seleccién.
En la captura de pantalla a continuacién, un usuario ha ejecutado el programa, ha hecho clic en la primera fila y luego
hha hecho clic en la tercera fila. Observe el contomo alrededor de la titima celda en la que hizo clic; asi es como se ve
y 8e siente ol Metal, destaca la seleccién principal
alex
S]
FirstName LastName Sport #ofYears Vegetarian ||
ati. ‘Sin Showboarding
John Doe
Sue ‘Black
Jane white
Rowing |
inti
Speed reading |
Selection Made
@ Mutiple intenal Selection
© Single Selection
© Single Interval Selection
Selection Options
(Row Selection
[1 Column selection
ROW SELECTIONEVENT, Lead 0, 3. Rows: 0, Columns 3
Fowee SELECTION EVENT, Leads 0, 3. Rows: 0, Columns: 3
ROW SELECTION EVENT. Lead: 2, 2. Rows: 02. Columns: 23,
poe SELECTIONEVENT. Load: 2, 2. Rows: 02, Couumne: 2.
En "Modo de seleccién* hay un conjunto de botones de opcién. Haga clic en la etiquetada *Seleccién tnica’. Ahora
solo puede seleccionar una fla a la vez. Si hace clic en el botén de opcién "Seleccién de intervalo Unico’, puede
seleccionar un conjunto de filas que deben ser contiguas.
Todas los botones de radio en "Modo de seleccién” invocan JTable. s=tselect .ce. Este método toma un solo
argument, que debe ser una de las siguientes constantes definidas
en javax. swing. ListSelectionMedel: MULTIPLE INTERVAL SELECTION, SINGLE INTERVAL SELECTION,
y SINGLE_SELECTTON.
Volviendo a PabieselectionDeno, observe las tres casillas de verificacién de opciones en "Opciones de
seleccion’, Cada casilla de verificacién controla el estado de una boo Leanvariable enlazada definida por J.ab»1e
+ La"Seleccién de fla” controla rowselect ionAl Lowedqué tiene 6! método
setter = onal Lowedy el método getter yet RowSelect ionAl lowed, Cuando esta propiedad
enlazada es truc(y la columnselect ion’ Lowedpropiedad es fal se), el usuario puede seleccionar por fila
+ La"Seleccién de columna" controla colunnseectionA1lowedel método
seller setColunnSelect ionAl lowedy el método getter getColunnSelectionAllcwed. Cuando esta
propiedad enlazada es truely la rowSe lect ion] lowedpropiedad enlazada es a ).se), el usuario puede
seleccionar por columna,
+ Controles de "Seleccién de celda’ cel select !onznabled, que tiene el método
SeLectionEnablecy el método getter get cei 1select ionEnabled, Cuando esta propiedad
crue, el usuario puede seleccionar una sola celda o un bloque rectangular de celdas,
hitpsildocs.orace.com/javaseftutorialuswinglcomponentstable htm 4202rri2020 (Cémo usar ablas (Los Tutoriales de Java ™> Crear una GUI con JFC / Swing> Usar componentes Swing)
NOTA: Jtab1e utiliza un concepto muy simple de seleccién, administrado como una interseccién de filas y
columnas. No fue disefiado para manejar selecciones de celdas totalmente independientes.
Si desactiva las tres casillas de verificacién (configurando las tres propiedades enlazadas a f21se),no hay
seleccién; solo se muestra la seleccién principal
Puede observar que Ia casilla de veriicacién "Seleccién de celda” esta deshabilitada en el modo de seleccién de
intervalos miltiples. Esto se debe a que la seleccién de celdas no se admite en este modo en la demostracién. Puede
cespecificar la seleccién por celda en el modo de seleccién de intervalos miltiples, pero el resultado es una tabla que
no produce selecciones tiles.
También puede notar que cambiar cualquiera de las tres opciones de seleccién puede afectar a las demés. Esto se
debe a que permitir la seleccién de filas y columnas es exactamente lo mismo que habiltar la seleccién de
celdas, vab1 eactualiza automaticamente las tres variables enlazadas segiin sea necesario para mantenerlas
consistentes,
NOTA: Establecer ce11sels
enBnabledun valor tiene el efecto secundario de establecer también
ambos bledy colunnSeLlectionEnabledese valor, Establecer
ambos roxSe lect ionEnabledy columnSelect ionEnablecun valor tiene el efecto secundario de
establecer también cel1select ionEnabledese
valor, Establecer rowSelect ion=nabledy columnSelectionEnabledpara diferentes valores tiene el
efecto secundario de establecer también ce! Select ionEnableden false.
Selection!
Para recuperar la seleccién actual, use JYablc.getselectedsowsque devuelve una matriz de indices de fila
yoTabls.getselectedCo!umnsque devuelve una matriz de indices de columna. Para recuperar las coordenadas
de la seleccién principal, consulte los modelos de seleccién para la tabla misma y para el modelo de columna de la
tabla. El siguiente cédigo formatea una cadena que contiene la fila y la columna de la seleccién principal:
String.format (“Seleccién de leads:% d,% d.",
table. getSelectionNodel (). getLeadSelectionindex (),
table.getColunnodel (). getSelectionMedel (). getLeadSelectionIndex ());
Las selecciones de los usuarios generan una serie de eventos. Para obtener informacién sobre estos, consulte Cémo
escribir un oyente de seleccién de lista en la leccién Escribir ayentos de eventos
NOTA: Los datos de seleccién en realidad describen celdas seleccionadas en la "vista" (datos de la tabla
tal como aparecen después de cualquier clasificacién o fitrado) en lugar de en el modelo de la tabla. Esta
distinci6n no importa a menos que los datos vistos se hayan reorganizado mediante la clasificacion, e|
fillsado o fa manipulacién de columnas por parte del usuario. En ese caso, debe convertir las coordenadas
de seleccién utilzando los métodos de conversién descritos en Ordenar y fitrar
Crear un modelo de tabla
Cada objeto de tabla usa un objeto de modelo de tabla para administrar los datos reales de la tabla. Un objeto de
modelo de tabla debe implementar la "ais! Moce7interfaz. Si el programador no proporciona un objeto de modelo de
tabla, J?ab lecrea automaticamente una instancia debe Fa It T=) eNioce |. Esta relacion se ilustra a continuacién.
Object
Table Object >, <-> Table Dats
El stab econstructor utlizado pot Simple?ab1e3encerea su modelo de tabla con un cédigo como este:
nuevo AbstractTableModel () {
public String getColunnNane (int col) (
return colunnNanes [col] .toString ();
Public int getRowCount () {return row0ata.length; }
public int getColunncount () {return columnNanes. length; }
Objeto publico getValueat (int fila, int col) {
return rowbata [fila] [col];
hitpsildocs.orace.com/javaseftutorialuswingleomponentsitabe htm 51202rri2020 (Cémo usar ablas (Los Tutoriales de Java ™> Crear una GUI con JFC / Swing> Usar componentes Swing)
Public boolean iscelléditable (int fila, int col)
(return true; }
public void setvalueat (valor del objeto, int fila, int col) {
rowata [fila] [col] = valor;
fireTablecellUpdated (Fila, col);
y
Como muestra el cédigo anterior, implementar un modelo de tabla puede ser simple, Generalmente, implementa su
modelo de tabla en una subclase de la Abstract Tab!eMode |¢lase.
‘Su modelo puede contener sus datos en una matriz, vector o mapa hash, o puede obtener los datos de una fuente
externa como una base de datos. Incluso podria generar los datos en tiempo de ejecucién.
Esta tabla es diferente de la simplevabeDemotabla de las siguientes maneras:
+ TableDemoEl modelo de tabla personalizado, aunque es simple, puede determinar facilmente el tipo de datos,
lo que ayuda a 77'2)>1 emostrar los datos en el mejor formato. SimpleTabyieDemcEl modelo de tabla creado
automaticamente, por otro lado, no sabe que la columna Nam . de afios contiene nimeros (que generalmente
deben estar alineados ala derecha y tener un formato particular). Tampoco sabe que la
contiene valores booleanos, que pueden representarse mediante casillas de verificacion.
‘+ Elmodelo de tabla personalizado implementado en Tai»1LeDemono le permite editar las columnas de
nombre; Sin embargo, le permite editar las otras columnas. En simp leTableDemo, todas las celdas son
editables,
jegetariancolumna
‘Vea a continuacién el cédigo tomado de Pablebeno.. javaque es diferente del SimpLe?ablebemo. java. La fuente
en negrita indica el cédigo que hace que el modelo de esta tabla sea diferente del modelo de tabla definido
automaticamente para SimpleTableDeno.
public Tabledeno ()
Tabla JTable = nueva JTable (nueva MyTableModel ());
y
Clase MyTableModel extiende abstractIablevodel {
private String [] colunpNanes = ... // igual que antes ...
private Object [] [] data = ... // igual que antes
public int getColumncount () {
return colunaNanes. length;
y
public int getRowcount () {
devolver datos. length;
>
public String getColumnNare (int col) (
return colunnNanes [col];
»
Objeto pablico getvaluent (int fila, int col) {
devolver datos [fila] [col];
y
public Class getColumnclass (int c) {
return getvalueat (8, c) .getClass ();
»
ye
= No es necesario implenentar este método a menos que su tabla sea
* editable.
“7
public boolean isCelleditable (int fila, int col) (
7/ Tenga en cuenta que 1a direccién de datos / celda es con:
// no importa donde aparezca 1a celda en pantalla.
si (col <2) {
falso retorno;
} mas {
volver verdadero;
y
y
hitpsildocs.orace.com/javasefttorialuswingleomponentsitable htm 21202rri2020 (Cémo usar ablas (Los Tutoriales de Java ™> Crear una GUI con JFC / Swing> Usar componentes Swing)
ye
+ No es necesario inplenentar este método a menos que su tabla sea
* los datos pueden canbiar.
+7
public void setvalueat (valor del objeto, int fila, int col) {
datos [fila] [col] = valor;
fireTablecellUpdatec (Fils, col);
}
Escuchando los cambios de datos
Un modelo de tabla puede tener un conjunto de oyentes que reciben notificaciones cada vez que cambian los datos de
la tabla, Los oyentes son instancias de Talb!e¥oce 11 stener. En el siguiente cédigo de
ejemplo, Simple Tab leDemose extiende para incluir dicho oyente. El nuevo cédigo esta en negrita,
Anport javax.suing.event. *;
inport javax.swing. table. TableModel;
public class SimpleTableDeno ... implenenta TableModelListener {
public SinpleTabledeno () {
table.getModel (). addTableModelListener (esto);
}
public void tablechanged (TableModelevent e) {
int fila = e.getFirstRow ();
int columa = e.getcolunn ()3
Modelo de Tabletodel = (TableNodel) e.getSource ()5
Cadena columnNane = nodel.getColunnNane (colunna);
Datos del objeto = madel.getValueat (fila, colunna);
// Haz algo con Los datos ...
y
Disparar eventos de cambio de datos
Para activar eventos de cambio de datos, el modelo de tabla debe saber cémo construir
un Tab LeMode/Sventobjeto, Este puede ser un procedimiento complejo, pero ya estd implementado
en Default ?ablevode2. Puede permitir 77abLeutlizar su instancia predeterminada de Default Tablevedel, 0
crear su propia subclase personalizada de Default TableMode
Si DefaultTabletiodeino es una clase base adecuada para su clase de modelo de tabla personalizada, considere
la subclasennst ract Tabl.eVode!. Esta clase implementa un marco simple para
consttuir 1abLeviede2Eventobjetos. Su clase personalizada simplemente necesita invocar uno de los
st ract TableMode lmétodos cada vez que una fuente externa cambia los datos de la tabla.
siguientes ai
Método [Cambio
fireTableCellUpdated [Actualizacién de celda especificada.
reTableRowsUpdated [Actualizacién de filas especificadas
fireTableDataChanged [Actualizacin de toda la tabla (solo datos).
fireTableRows Inserted [Nuevas filas insertadas.
fireTableRowsDeleted IFilas existentes eliminadas
fireTablestru
‘tureChanged ||Invalidar toda la tabla, tanto datos como estructura.
Conceptos: editores y renderizadores
‘Antes de continuar con las siguientes tareas, debe comprender cémo las tablas dibujan sus celdas. Puede esperar que
cada celda de una tabla sea un componente. Sin embargo, por razones de rendimiento, las tablas Swing se
implementan de manera diferente.
hitpsildocs.orace.com/javaseftutorialuswingleomponentsitabe htm 71202rri2020 (Cémo usar ablas (Los Tutoriales de Java ™> Crear una GUI con JFC / Swing> Usar componentes Swing)
En cambio, un renderizador de una sola celda se usa generalmente para dibujar todas las celdas que contienen el
mismo tipo de datos. Puede pensar en el renderizador como un sello de tinta configurable que la tabla usa para
‘estampar datos con el formato adecuado en cada celda, Cuando el usuario comienza a editar los datos de una colda ,
Un editor de celdas se hace cargo de la celda y controla el comportamiento de edicién de la celda.
Por ejemplo, cada celda en la columna # de aflosab1eveno contiene Nunberdatos, especificamente,
un tnt egerobjeto. De manera predeterminada, el renderizador de celdas para una Numbezcolumna que contiene una
sola JLabe linstancia utiliza los numeros apropiados, alineados a la derecha, en las celdas de la columna. Si el
usuario comienza a editar una de las celdas, el editor de celdas predeterminado usa un alineado J7ext¥ielda
la derecha para controlar la edicién de la celda.
Para elegir el renderizador que muestra las celdas en una columna, una tabla primero determina si usted especificé un
renderizador para esa columna en particular. Si no lo hizo, la tabla invoca el getColunnCiassmétodo del modelo de
tabla , que obtiene el tipo de datos de las celdas de la columna. A continuacién, la tabla compara el tipo de datos de la
columina con una lista de tipos de datos para los que se ragistran los procesadares de celdas. La lista inicializa esta
lista, pero puede agregarla o cambiarla, Actualmente, las tablas ponen los siguientes tipos de datos en la lista:
+ Boolean -Prestados con una casilla de verificacién.
‘+ Number - prestados por una etiqueta alineada a la derecha.
+ Double, Float: igual que umber, pero la traduccién de objeto a texto es realizada por
una NurberPornatinstancia (utilizando el formato de ntimero predeterminado para la configuracién regional
actual)
Representado por una etiqueta, con la traduccién de objeto a texto realizada por
una pateFermatinstancia (utlizando un estilo corto para la fecha y la hora).
+ TmageTcon, Tcon- representado por una etiqueta centrada.
Representado por una etiqueta que muestra el valor de la cadena del objeto,
Los editores de celda se eligen usando un algoritmo similar.
Recuerde que si deja que una tabla cree su propio modelo, se usa object como el tipo de cada columna. Para
especificartipos de columna mas precisos, el modelo de tabla debe definir el get Columnc1assmétodo
adecuadamente, como lo demuestra Taln!eemo. java
Tenga en cuenta que aunque los procesadores determinan cémo se ve cada encabezado de celda o columna y
pueden especificar ol toxto de la informacién sobre herramientas, un procesador no maneja eventos. Si necesita
recoger los eventos que tienen lugar dentro de una mesa, la técnica que utiliza varia segiin el tipo de evento que le
interese:
[Situacion [Cémo obtener eventos
Para detectar eventos de una Use el editor de celdas (0 registre un oyente en el editor de
‘celda que se esta editando ... _||celdas).
Para detectar selecciones y __|Use un oyente de seleccién como se describe en Deteccion
\deselecciones de fila / columna |\de selecciones de usuario
I celda .
Para detectar eventos del [Registre el tipo apropiado de escuicha de mouse en
mouse en el encabezado de _ el STableHeaderobjeto de la
luna columna ltabla . (Ver?ainlesorter. javapara un ejemplo.)
Para detectar otros eventos ... [Registre el oyente apropiado en el JTab 1 cobjeto.
Las siguientes secciones le indican cémo personalizar la visualizacién y la edicién especificando renderizadores y
editores. Puede especificar editores y editares de celda por calumna o por tipo de datos.
Usar renderizadores personalizados
Esta seccién le dice cémo crear y especificar un procesador de celdas. Puede configurar un procesador de celdas de
tipo conereto utilizando la JTablemétodo set De aul :Rendarer. Para especificar que las células en una columna
en particular deben utilizar un procesador, se utiliza el TableColumnmétodo se=Cel1Rendezer. Incluso puede
especificar un renderizador especifico de celda creando una JTabLesubclase.
Es facil de personalizar el texto 0 la imagen representada por el procesador
predeterminado, Default TableCell Renderer. Simplemente cree una subclase e implemente el setValuemétodo
Para que invoque set Texto set Iconcon la cadena o imagen adecuada. Por ejemplo, asi es como se implementa el
procesador de fecha predeterminado:
hitpsildocs.orace.com/javaseftutorialuswingleomponentsitabe htm 81202rri2020 (Cémo usar ablas (Los Tutoriales de Java ™> Crear una GUI con JFC / Swing> Usar componentes Swing)
La clase estatica DateRenderer extiende DefaultTableCellRenderer {
Formateador DateFormat;
public DateRenderer () {
uper ()3
public void setvalue (valor del objeto) (
if (Formateador == nulo) {
fornateador = DateFormat .getDateInstance ();
y
setText ((value
null)? ": formatter. format (value);
}
Sila extension DefaultTableceliRendereres insuficiente, puede construir un renderizador utilizando otra
superclase. La forma mas facil es crear una subclase de un componente existente, haciendo que su subclase
implemente la "ab! eCe1 “Readerevinterfaz, TableCe11Rendererrequiere simplemente un
método: get7ableCel /RendererCenponent. La implementacién de este método debe configurar el componente de
representacién para reflejar el estado pasado y luego devolver el componente.
En la instanténea de Tab epialo:
Subclase de JLabelllamado Colorsendere
implementa
EditDeno, el renderizador utilizado para las celdas de Color favorito es una
Aqui hay extractos Colorsenderer. Javaque muestran cémo se
clase piblica Colorenderer extiende 3Label
Amplenenta TableceliRenderer {
ColorRenderer pablico (boolean issordered) {
‘this.istordered = isdordered;
setOpaque (verdadero); // DEBE hacer esto para que aparezca el fondo.
y
Conponente pablico getTableceliRendererComponent (
3Table table, Color de objeto,
boolean isSelected, boolean hasFocus,
int fila, int colunma) {
Color newColer = (Color) color;
setBackground (newColor) ;
Af (isBordered) (
if (isSelected) {
J selectedBorder es un borde sélido en el color
//table.getSelectionsackground ()
setBorder (selectedBorder);
17 unselectedBorder es un borde sélido en el color
//table.getBackground ()
setBorder (unselectedBorder) ;
y
setToolTiptext (...); // Discutido en La siguiente seccién
devuelve estos
y
Aqui esta el cddigo "abt eDiatoyldi theo. javaque registra una ColorRendererinstancia como el renderizador
predeterminado para todos los Co lordatos:
table.setbefaultRenderer (Color.class, nuevo ColorRenderer (verdadero);
Para especificar un renderizador especitico de celda, debe definir una J’Ta>1esubclase que anule
al gotCol IRenderermétodo. Por ejemplo, el siguiente cédigo hace que la primera celda de la primera columna de la
tabla use un renderizador personalizado:
TableceliRendere= weirdRendere!
table = new JTable (...) {
public TableCellRenderer getcellRenderer (int fila, int colunna) (
new WeirdRenderer ();
if ((#ila == @) && (colunna == @)) {
Volver raroRenderers
y
11 mas...
return super.getCeliRenderer (Fila, colunna);
hitpsildocs.orace.com/javaseftutorialuswingleomponentsitabe htm 91202rri2020 (Cémo usar ablas (Los Tutoriales de Java ™> Crear una GUI con JFC / Swing> Usar componentes Swing)
y
Especificacién de informacién sobre herramientas para celdas
De manera predeterminada, el texto de informacién sobre herramientas que se muestra para una celda de a tabla esta
determinado por el renderizador de la celda. Sin embargo, a veces puede ser més sencillo especificar el texto de
informacion sobre herramientas anulando 77l>1cla implementacién
del yetTooiTipText (MouseEvent) método, Esta seccién le muestra cémo usar ambas técnicas.
Para agregar informacion sobre herramientas a una celda usando su renderizador, primero debe obtener o crear el
renderizador de la celda. Luego, después de asegurarse de que el componente de representacién es a JComponent
invoque el setTool TipTextmétodo en él.
Un ejemplo de configuracién de informacién sobre herramientas para celdas est en Table Renderdeme. Haga clic en
el botén Iniciar para ejecutarlo utiizando Java ™ Web Start ( descargue JDK 7 0 posterior ). O, para compilar y
ejecutar el ejemplo usted mismo, consulte el indice del ejemplo
era
El cédigo fuente esta adentro ‘rain cRenderDeno. java, Agrega informacién sobre herramientas a las celdas de
la columna Sport con el siguiente oédigo:
// Configurar consejos sobre herranientas para las células deportivas.
DefaultTablecellRenderer renderer =
nuevo DefaultTableceliRenderer ();
Fenderer.setToolTipText ("Haga clic para el cuadro combinado’
sportColuan.setCeliRenderer (procesador);
‘Aunque el texto de informacién sobre herramientas en el ejemplo anterior es estatico, también puede implementar
informacién sobre herramientas cuyo texto cambia segiin el estado de la celda o el programa. Aqui hay un par de
formas de hacerlo:
‘+ Agregue un poco de cédigo a la implementacién del g=t'TableCel JRendererComponentmétodo por parte
del procesador .
+ Anular el 2Tablemétodo get Tool Tiprext (MouseEvent)
Un ejemplo de agregar cédigo a un renderizador de celdas est en Tab=eDialogZditDemo. Haga clic en el botén
Iniciar para ejecutarlo utilizandoJava "™ Web Start ( descargue JDK 7 0 posterior ). O, para compllar y ejecutar el
‘ejemplo usted mismo, consulte el indice del ejemplo .
Demousa un procesador de colores, implementado en Colorsenderer. java, que establece el
texto de informacion sobre herramientas usando el cédigo de negrita en ol siguiente fragmento:
clase piblica Colorkenderer extiende JLabel
implenenta TableceliRenderer {
Componente pablico getTableceliRendererComponent. (
ITable table, Color de objeto,
boolean isSelected, boolean hasFocus,
int fila, int columna) {
Color newColer = (Color) colér;
SetToolTipText (“Valor RGB:" + newColor.getRed () +
+ newColor.getGreen () +
+ newColor.getBlue ())5
devuelve estos
y
Aqui hay un ejemplo de cémo se ve a informacién sobre herramientas:
hitpsildocs.orace.com/javaseftutorialuswinglcomponentstable htm 10120ari2020 (Cémo usar ablas (Los Tutoriales de Java ™> Crear una GUI con JFC / Swing> Usar componentes Swing)
s] Emre Deus =(5/ x!
FirstName Favorite Color Sport #ofvears Vegetarian
Mary MEE Spowboarcing
isan Rowing
ath: ilu. 51,51, 163)
‘Sharon ing
Puede especificar ol texto de informacién sobre herramiontas
anulando sTableel getToolTipText (MouseBvent) método. El programa TableToolTipsDemomuestra
cémo. Haga clic en el bot6n Iniciar para ejecutarlo utlizando Java ™ Web Start ( descargue JDK 7 0 posterior ). O,
para compilar y ejecutar el ejemplo usted mismo, consulte el indice del ejemplo
Las celdas con informacién sobre herramientas se encuentran en las columnas Deporte y Vegetariano . Aqui hay una
foto de su informacién sobre herramientas:
4] eTo Demo oO) x
First Name Last Name Sport Hot vears Vegetarian
Katty ‘Sith ‘Showboarding
John Doe Rowing
Sue Black ini 7 =
wane white ‘Spe This person's favorite sport fo participate in is: Row
Aqul esta el cédigo Tabievo01T
las columnas Sport y Vegetarian :
Jomo. javaque implementa informacién sobre herramientas para celdas en
Tabla JTable = nueva JTable (nueva MyTableModel ()) {
71 Inplementar informacién sobre herranientas de celda de tabla.
public String getToolTipText (MouseEvent e) (
Punta de cadena = nulo;
java.aut.Point p = e.getPoint ();
int rowIndex = rowatPoint (p);
Ant colIndex = colunnatPoint (p);
int realColunnindex = convertColunnIndexToModel (colIndex)
Af (realColunntndex
tip =
2) {// Coluna deportiva
"1 deporte favorite de esta persona para”
+ “participar en es:
+ getValueat (rowIndex, colIndex);
} else if (realColunnindex == 4) {// Colunna vegetariana
Modelo de TableModel = getModel ();
String FirstName = (String) model.getValueAt (rowIndex, @);
String lastNane = (String) model.getValueat (rowindex, 1);
Veggie booleana = (Boolean) model.getValueat (rowindex, 4);
if (Boolean. TRUE.equals (veggie) {
‘consejo = nonbre + "" + apellido
+ "es vegetariano”;
y mss ¢
consejo = nonbre + "" + apellido
+ “no es vegetariano";
y
} else (// otra colunna
// Puedes omitir esta parte si sabes que no
1/ tener renderizadores que proporcionen su propia herramienta
J /consejos.
tip = super.getToolTiptext (e);
y
punta de retorno;
y
El cédigo es bastante sencillo, excepto quizds por la llamada a convert Column Index" oMode 1. Esa llamada es
necesaria porque si el usuario mueve las columnas, el indice de la vista para la columna no coincidira con el indice del
modelo para la columna, Por ejemplo, el usuario puede arrastrar la columna Vegetariana (que el modelo considera
hitpsildocs.orace.com/javaseftutorialuswinglcomponentstable htm 1021vi2020 (Cémo usar tablas (Los Tutoriales de Java “> Crear una GUI con JFC / Swing> Usar components Swing)
que esta en el indice 4) para que se muestre como la primera columna, en el indice de vista O.
Como preparezendererproporciona el indice de vista, debe traducir el indice de vista a un indice de! modelo para
que pueda estar seguro de que se ha seleccionado la columna deseada,
Especificacién de informacién sobre herramientas para encabezados de columna
Puede agregar una informacién sobre herramientas al encabezado de una columna configurando el texto de
informacién sobre herramiontas para la tabla 77ab! cHeader. A menudo, diferentes encabezados de columna
requieren diferentes textos de informacion sobre herramientas. Puede cambiar el texto anulando
el getT001T: pTextmétodo del encabezado de la tabla . Altemativamente, puede
invocar Tab 1eColumn. setHeaderRendererpara proporcionar un renderizador personalizado para el encabezado.
‘Se encuentra un ejemplo del uso del mismo texto de informacién sobre herramientas para todos los encabezados de
columnaraleSorterdeno. java, Asi es como establece el texto de informacién sobre herramientas:
table.getTableHieader (). setToolTipText (
“Haga clic para ordenar; Shift-Haga clic para ordenar en orden inverso”);
"ableYoolTipsbeno. javatiene un ejemplo de implementacién de informacién sobre herramientas de encabezado
de columna que varia segtin la columna. Si ejecuta Tab 1e''001 Tpsbemo(haga clic en el bot6n Iniciar) con Java ™
Web Start ( descargue JDK 7 0 posterior }. O, para compilar y ejecutar el ejemplo usted mismo, consutte el indice del
ejemplo
june
Verd la informacién sobre herramientas cuando pase el mouse sobre cualquier encabezado de columna, excepto los
dos primeros. No se completaron sugerencias de herramientas para las columnas de nombres, ya que parecian
explicarse por si mismas, Aqui hay una imagen de una de las sugerencias de herramientas de encabezado de
column
oes lo] x|
FiistName | LastName | _Spor Hofvears | Vegetarian | |
Kathy ‘Smith ‘Snowboardi im \+|
Liohn Dae Rowing | In REVSOS avons SforitoRaMieiate Tn
sue Black Kiting an
\Jane ‘White [Sneed reading 20) i al
El siguiente cédigo implementa la informacién sobre herramientas. Basicamente, crea una subclase
de JTableteaderque anula el get'Too1Tiptext (MouseE vent) método para que devuelva el texto de la columna
actual. Para asociar el encabezado de la tabla revisada con la tabla,
el JTainLemétodo creat eDefaultTablelieaderse reemplaza para que devuelva una instancia de
la JTabletieadersubdlase.
jlunnToolTips = {
‘asuido obvio
nul, // "Apellido" asunido cono obvio
"El deporte favorito de 1a persona para participar",
-L numero de afios que 1a persona ha practicado el deporte”,
"Si se marca, 1a persona no come carne”};
Tabla JTable = nueva JTable (nueva MyTableModel ()) {
11 Inplementar informacién sobre herranientas de encabezado de tabla.
dTableHeader protegido createDefaultTableHeader () {
devolver nuevo JTableHeader (colunnModel) {
public String getToolTiprext (MouseEvent e) {
Punta de cadens = nulos
Java.awt.Point p = e.getPoint ();
int index = colunnModel.getColunntndexAtx (px);
int realIndex
colunnModel.getColunn (index) .getModelindex ();
return colunnToolTips [realIndex];
hitpsildocs.orace.com/javaseftutorialuswinglcomponentstable htm 127202rri2020 (Cémo usar ablas (Los Tutoriales de Java ™> Crear una GUI con JFC / Swing> Usar componentes Swing)
Ordenar y filtrar
La clasificacién y a! fitrado de tablas se gestionan mediante un objeto clasificador . La forma mas facil de proporcionar
tun objeto clasificador es establecer la autoCreateRowSorterpropiedad vinculada a
Tabla JTable = new JTable ();
table.setAutoCreateRowSorter (verdadero);
Esta accién define un clasificador de fllas que es una instancia de javax. ©wing. table. TableRowsorter. Esto
proporciona una tabla que realiza una ordenacién simple especifica del entorno local cuando el usuario hace clic en el
encabezado de una columna, Esto se demuestra en! als 1c: 1, como se ve en esta captura de pantalla
Seba _ lolx
[FirstName |Last Name Sport #ofveas | Vegetarian |
any Sri Snowboarding Ee
Uonn Doe Rowing 3
ue Bland renting a =|
ane White Speed reading 30 Sj
Para tener mas control sobre la ordenacién, puede construir una instancia TableRowSortery especificar que es ol
objeto clasificador de su tabla.
Clasificador TableRowSorter
huevo TableRowSorter (table.getModel ())5
table.setRowSorter (clasificador);
‘TableRowSorterusa java.util.Comparatorobjetos para ordenar sus filas. Una clase que implementa esta
interfaz debe proporcionar un método llamado conpareque defina cémo se comparan dos objetos con el fin de
ordenarlos. Por ejemplo, el siguiente cédigo crea un Comparatorque ordena un conjunto de cadenas por la titima
palabra en cada cadena:
Comparador comparador = nuevo Comparador () {
public int compare (Cadena si, Cadena s2) {
Cadena [] cadenast = si.split ("\\ s");
Cadena [] cadenas2 = s2.split ("\\ s°);
return strings1 [stringsi.length - 1]
sconpareTo (strings2 [strings2.length - 1]);
y
pr
Este ejemplo es bastante simplista; mas tipicamente, una Conparstorimplementacién es una subclase
de Java. text .Col later, Puede definir su propia subclase, usar los métodos de fabrica Collatozpara obtener
‘torpara un entorno local especifico 0 usar} ava. text .RuleRasedt:
un Compa ator.
Para determinar cudl Comparatozusar para una columna, TableRowSortezintenta aplicar cada una de las
siguientes regias. Las regias se siguen en el orden que se detalla a continuacion; Comparatorse utiliza la primera
regla que proporciona al clasificador a , y las reglas restantes se ignoran.
1, Sise ha especificado un comparador invocando se: Comparator, use ese comparador,
2. Siel modelo de tabla informa que los datos de la columna consisten en cadenas
(TableModel .getColumnClassretornos String. classpara esa columna), use un comparador que
clasifique las cadenas segtin la configuracién regional actual
3, Sila clase de columna devuelta por TalsleModel . getColumnClassimplementos Comparable, use un
‘comparador que clasifique las cadenas segtin los valores devueltos por Comparable. comparete
4. Si se ha invocado un convertidor de cadenas para la tabla invocando ingConverter, use un
‘comparador que clasifique las representaciones de cadenas resultantes en funcién de la configuracién regional
actual
5. Sino se aplica ninguna de las reglas anteriores, use un comparador que invoque test rinclos datos de la
columna y clasifique las cadenas resultantes segiin la configuracién regional actual
Para tipos mas sofisticados de clasificacién, subclase Tab leRowsortero su clase
principal javax.swing.DefaultRowSorter.
Para especificar el orden de clasificacién y la prioridad de clasificacion para las columnas,
invoque setsorteys. Aqui hay un ejemplo que ordena la tabla utilizada en los ejemplos por las dos primeras
columnas. La precedencia de las columnas en la clasificacién se indica mediante el orden de las claves de
lasificacion en la lista de claves de clasificacion, En este caso, la segunda columna tiene la primera clave de
clasificacién, por lo que las flas se ordenan por nombre y apellido.
hitpsildocs.orace.com/javaseftutorialuswinglcomponentstable htm 131202rri2020 (Cémo usar ablas (Los Tutoriales de Java ™> Crear una GUI con JFC / Swing> Usar componentes Swing)
Lista sortkeys
new ArrayList ();
sortkeys.add (nuevo RowSorter.SortKey (1, SortOrder. ASCENDING) );
sortkeys.add (nuevo RowSorter-SortKey (@, SortOrder ASCENDING) );
sorter. setSortkeys (sortkeys);
‘Ademés de reordenar los resultados, un clasificador de tablas también puede especificar qué filas se mostraran. Esto
se conoce como filtrado , TableRowSoztezimplementa el fitrado
Utiizando javax. swing. RowFi lterobjetos. RowF il tezimplementa varios métodos de fabrica que crean tipos
comunes de filtros. Por ejemplo, regexF il verdevuelve un RowFi i terfiltro que se basa en una expresién regular
En el siguiente cédigo de ejemplo, crea explicitamente un objeto clasificador para que luego pueda usarlo para
especificar un filtro
MyTableModel model = new MyTableModel ();
sorter = new TableRowSorter (rodelo) ;
tabla = nueva JTable (modelo);
table.setRowSorter (clasificador);
Luego, ftra segtin el valor actual de un campo de texto:
private void newFilter () {
RowFilter rf = null;
/1 Si la expresién actual no se analiza, no actualice.
tratar (
rf = RowFilter.regexFilter (filterText.getText (), @)5
} catch (java.util. regex.PatternsyntaxException e) {
regreso;
y
Sorter. setRouFilter (rf);
}
En un ejemplo posterior, newPiLtex () se invoca cada vez que cambia el campo de texto. Cuando el usuario ingresa
expresiones regulares complicadas, try. . .catchevita que la excepcién de sintaxis interfiera con la entrada.
Cuando una tabla usa un clasificador, los datos que ven los usuarios pueden estar en un orden diferente al
especificado por el modelo de datos, y pueden no incluir todas las filas especificadas por el modelo de datos. Los.
datos que el usuario ve realmente se conocen como la vista y tienen su propio conjunto de
coordenadas. JTabeproporciona métodos que convierten las coordenadas del modelo para ver las coordenadas -
conver=Column ndexToViewy convertRowindexToV ew y que convierten las coordenadas de la vista en
coordenadas del modelo column index’
ver jodely conver tRowIndex’oModel,
NOTA: Cuando use un clasificador, recuerde siempre traducir las coordenadas de las celdas.
El siguiente ejemplo retne las ideas discutidas en esta seccién. vableilterdeno. javaagrega un pequefio nimero
de cambios a TalpicDeno. Estos incluyen los fragmentos de cédigo anteriores en esta seccién, que proporcionan un
clasificador para la tabla principal y utilizan un campo de texto para proporcionar la expresién regular de filtrado. La
siguiente captura de pantalla se muestra Tab lef: lterDemoantes de que se haya ordenado o filtrado. Observe que la
fila 3 en el modelo sigue siendo la misma que la fila 3 en la vista:
ESE Pos
FirstName | __LastName Sport #ofYears | Vegetarian | |
Katy ‘Smith ‘Snowboarding | @ <
\Jonn Doe Rowing 3
Sue Black Knitting 2
iane [white ‘Sheed reading eI =
Filter Text:
stats; [Seledeu Row nview. 9 GelecteaRowin monet 3 |
Siel usuario hace clic dos veces en la segunda columna, la cuarta fila se convierte en la primera fila, pero solo en la
vista:
hitpsildocs.orace.com/javaseftutorialuswinglcomponentstable htm 14120ari2020 (Cémo usar tablas (Los Tutoriales de Java ™> Crear una GUI con JFC / Swing> Usar componentes Swing)
s] E Bene =(5/ x!
FirstName Last Name ~ Spert #ofvvears ‘Vegetarian
jane whit Speed readin x
Kathy Smith Snowboarding
John Doe Rowing
\Joe Brown Pool
Filter Text:
Status: [Selected Row in view: 0. Selected Rowin model. 3.
Como se sefialé anteriormente, el texto que el usuario ingresa en el campo de texto "Fillrar texto" define un filtro que
determina qué filas se muestran. Al igual que con la ordenacién, el fitrado puede hacer que las coordenadas de vista
diverjan de las coordenadas del modelo:
4] S Demo -|5) x!
FirstName |Last Name ~ Sport #of Years ‘Vegetarian
Jane ite ‘Speed reading 20 vi
Fitter Text: [Janel
stats; [Seledeu Row nview- 0 GelecteaRowin monet
i estd el cédigo que actualiza el campo de estado para reflejar la seleccién actual:
table. getSelectionodel (). addListSelectionListener (
‘nuevo ListSelectionListener () {
public void valueChanged (evento ListSelectionévent) {
int viewRow = table.getSelectedRow ();
if (viewRow Crear una GUI con JFC / Swing> Usar componentes Swing)
Ee joj:
FirstName |_LastName Sport Forvears | Vegetarian
‘Rat Sinith Snnwhnardina ——[~
\John Doe :
[Sue lRowing
pee knitting
oe peed reading
[Poot
None of the above
El cédigo anterior es de Vais1eRenderDemo. java, Puede ejecutar ableRendexDeme(haga clic en el boton Iniciar)
usando Java ™ Web Start ( descargue JDK 7 0 posterior ). O, para compilar y ejecutar el ejemplo usted mismo,
onsulte al indice del ejemplo
Usar otros editores
Ya sea que esté configurando el editor para una sola columna de celdas (usando
el tabi: 1B: \étodo) 0 para un tipo especifico de datos (usando
el JTable setDefaultFaitormétodo), debe especificar el editor usando un argumento que se adhiera a
la Tabece1 Edi torinterfaz, Afortunadamente, los DefaultCel1Editoraperos de clase esta interfaz y
proporciona a los constructores permiten especificar un componente de edicién que es
na TextField, JCheckBox0 JComboBox. Por lo general, no es necesario que especifique explicitamente una
casilla de verificacién come editor, ya que las columnas con Booleandatos usan automaticamente un procesador y
editor de casillas de verificacién
olunn se
{Qué sucede si desea especificar un editor que no sea un campo de texto, casilla de veriicacién o cuadro
Combinado? Como Det axl te 1Eai torno es compatible con otros tipos de componentes, debe hacer un poco mas
de trabajo, Necesita crear una clase que implemente la Tab loCe? Ed itorinterfaz, La AbstractCel1Bcitordlase
es una buena superclase para usar, Implementa Tab Ja superinterfaz del usuario, lo que
le cot 18 torahorra la molestia de implementar el cédigo de activacién de eventos necesario para los editores de
celda.
Su clase de editor de celdas necesita definir al menos dos
métodos, got Cel 1EditorValuey get Tablece ‘Component. El getCel 1fditorvaluemétodo, requerido
Por Cel1Edi tor, devuelve el valor actual de la celda. El get TableCe11dito=Componentmeétodo, requerido
Por TaleCellEdi tor, debe configurar y devolver el componente que desea utilizar como editor.
‘Aqut hay una imagen de una tabla con un cuadro de dialogo que sirve, indirectamente, como editor de celdas. Cuando
el usuario comienza a editar una celda en la columna Color favorito , aparece un botén (el verdadero editor de
celdas) y abre el cuadro de dilogo, con el que el usuario puede elegir un color diferente,
hitpsildocs.orace.com/javasefttorialuswingleomponentsitable htm 16120ari2020 (Cémo usar ablas (Los Tutoriales de Java ™> Crear una GUI con JFC / Swing> Usar componentes Swing)
ESE Seen
Tag roo
Pevewo
hE ab serie 02 sample tot Hl
TRC
eB rier sone rt
(Lowa ] [cent] Lance]
Puede ejecutar "a leDialogiditvemo(haga clic en el botén Iniciar) usando Java ™ Web Start ( descargue JDK 7 0
posterior ). 0, para compilar y ejecutar el ejemplo usted mismo, consulte el indice del ejemplo
Aqui esta el cédigo, tomado de colorsai
.va, que implementa el editor de celdas.
Coloréditor de clase publica extiende AbstractCelleditor
inplenenta Tablecelleditor,
ActionListener
Color actual Color;
3 Botén de botén;
Icolorchooser colorchooser;
Didloge 3Dialog;
estdtica final protegida String EDIT = "editar";
Coloréditor piblico () {
‘botén = nuevo JButton ();
button. setActionConmand (EDITAR);
button -addActionListener (esto);
button. setorderPainted (falso) ;
/ Configure el didlogo que abre el botén.
colorchooser = new 3Colorchooser ();
dialog = IColorchooser.createDialog (botén,
“Elige un color",
verdadero, // modal
colorchooser,
esto, // OK botén controlador
nul); // sin controlador de botén CANCELAR
y
public void actionPerforned (Actionfvent ) (
AF (EDIT-equals (e.getActionConnand ())) {
// #1 usuario ha hecho clic en 1a celda, entonces
11 abre el didiogo.
button. setBackground (currentColor);
colorchooser.setColor (currentcolor);
dialog.setvisible (verdadero);
FireEditingStopped (); // Hacer que el renderizador vuelva a aparecer.
} else {// £1 usuario presioné el botén “Aceptar” del cuadro de didlogo.
hitpsildocs.orace.com/javasefttorialuswingleomponentsitable htm 17202rri2020 (Cémo usar ablas (Los Tutoriales de Java ™> Crear una GUI con JFC / Swing> Usar componentes Swing)
currentColor = colorchooser.getColor ();
>
// Inplenente el nétodo CellEditor que AbstractCelleditor no hace.
Objeto publico getCellEditorvalue () {
return currentColors
y
/I Inplenente el nico nétodo definide por TablecellEditor.
Conponente pablico getTablecelléditorconponent (tabla Iabie,
valor del objeto,
boolean isselected,
int fila,
columna int) {
currentColor = (Color) valor;
botén de retorno;
y
Como puede ver, el cédigo es bastante simple, La tinica parte que es un poco complicada es la llamada
al CizeBditingStoppedfinal del controlador de accién del botén del editor. Sin esta llamada, el editor permaneceria
activo, aunque el dialogo modal ya no sea visible. La llamada a le fireEdi t ingStoppedpermite ala tabla saber que
Puede desactivar el editor, permitiendo que el renderizador maneje nuevamente la celda,
Uso de un editor para validar texto introducido por el usuario
Si el editor predeterminado de una celda permite la entrada de texto, obtendré alguna comprobacién de errores de
forma gratuita si el tipo de celda se especifica como algo distinto de Stringo Object. La comprobacién de errores es
Un efecto secundario de convertir el texto ingresado en un objeto del tipo adecuado.
La verificacién automética de las cadenas ingresadas por el usuario ocurre cuando el editor predeterminado intenta
crear una nueva instancia de la clase asociada con la columna de la celda. El editor predeterminado crea esta
instancia utilizando un constructor que toma a Stringcomo argumento. Por ejemplo, en una columna cuyas celdas
tienen tipo rnteger, cuando el usuario escribe "123", el editor predeterminado crea el
correspondiente Tntecercédigo de uso equivalente anew Integer ("123"), Si el constructor produce una
excepcién, el contorno de la celda se vuelve rojo y se niega a dejar que el foco se mueva fuera de la celda. Si
implementa una clase utlizada como tipo de datos de columna, puede usar el editor predeterminado si su clase
proporciona un constructor que toma un Gnico argumento de tipo String,
Sile gusta tener un campo de texto como editor para una celda, pero desea personalizario, tal vez para verifcar ol
texto ingresado por el usuario de manera mas estrcta o para reaccionar de manera diferente cuando el texto no es
valido, puede cambiar el editor de celda para usar un texto formateado campo . Elcampo de texto formateado puede
verificar el valor de forma continua mientras el usuario esta escribiendo o después de que el usuario haya indicado e!
final de la escritura (por ejemplo, presionando Intro).
El siguiente cédigo, tomado de una demostracién llamada ain leF'TPEditDemo. java, configura un campo de texto
formateado como un editor que limita todos los valores enteros entre 0 y 100. Puede
ejecutar Tab1lePTFRa i cDemo(haga dlic en el botén Iniciar) usando Java ™ Web Start ( descargue JDK 7 0 luego } 0,
para compilar y ejecutar el ejemplo usted mismo, consulte el indice del ejemplo
El siguiente cédigo convierte el campo de texto formateado en el editor de todas las columnas que contienen datos de
tipo Integer
table. setbefaultéditor (Integer.class,
nuevo Integereditor (2, 108));
La Integeredi torcase se implementa como una subclase de D=‘au:1=ce1 120 corque utiliza un soporte
en JormattedTextFielclugar del JTextFieldque DefaultCe21Editoradmite, Esto se logra al configurar
primero un campo de texto formateado para usar un formato entero y tener los valores minimos y maximos
especificados, utllzando la API descrita en Cémo usar las campos de texto formateado . A continuacién, anula
la Defaultcel Edi toraplicacién de
las get'TableCel 1EditorComponent, getCellEdi to:
uey stopCel 1Edi t inglos métodos, la adicién de las
operaciones que son necesarias para los campos de texto con formato.
La anulacién de get Tab lece18aittorComponentestablece la propiedad de valor del campo de texto formateado (y
no solo la propiedad de texto de fa que hereda Tex Field) antes de que se muestre el editor, La anulacién
de getCe1 Edi torvalvemantiene el valor de la celda como Tateger, en lugar de, digamos, el Longvalor que el
hitpsildocs.orace.com/javasefttorialuswingleomponentsitable htm 181202rri2020 (Cémo usar ablas (Los Tutoriales de Java ™> Crear una GUI con JFC / Swing> Usar componentes Swing)
analizador del campo de texto formateado tiende a devolver. Finalmente, la anulacién le stopCe118ditingpermite
verificar si el texto es valido, posiblemente evitando que se descarte el editor. Si el texto no es valido, su
implementacién de stopCe! 1F Crear una GUI con JFC / Swing> Usar componentes Swing)
ltodos los datos en
lla columna Deporte , También selecciona
ide forma inteligente los tamarios de
lcolumna. Utiliza renderizadores para
imostrar informacion sobre herramientas
para las células deportivas.
\TableDialoglditDemo|Usar otros editores
(Modifica TableDemopara tener un editor y
lun editor de celdas que muestren un color y
le permitan elegir uno nuevo, usando un
Ididlogo de seleccién de color.
[Especificacién de
informacién sobre
\tableToolTipsD:
lencabezados de
lcolumna ,
lherramientas para
lceldas ,Especificacion
Ide informacion sobre
lherramientas para
[Muestra o6mo usar varias técnicas para
Iconfigurar el texto de informacién sobre
herramientas para celdas y encabezados
ide columna.
ITableSortDemo
lOrdenar y filtrar
Demuestra el clasificador predeterminado,
\que permite al usuario ordenar columnas
haciendo clic en sus encabezados.
lOrdenar y filtrar
Demuesira la clasificacién y el filtrado, y
\cémo esto puede hacer que las
‘coordenadas de la vista diverjan de las
‘coordenadas del modelo
limpresion
Demuesira la impresion de a mesa
|Como escribir un
ide lista
loyente de seleccién
[Muestra cémo usar todos los modos de
'seleccién de lista, usando un detector de
Iseleccién de lista que se comparte entre
luna tabla y una lista.
SharedModelDemo IEn ninguna parte
‘Se basa en ListSelect ionDemohacer
\que el modelo de datos se comparta entre
lla tabla y la lista. Si edita un elemento en la
primera columna de la tabla, el nuevo valor
se refleja on la lista
hitpsildocs.orace.com/javaseftutorialuswingleomponentsitabe htm
20120