Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Seleccionar JLabel en JTable

Hola a todos.

En estos momentos me encuentro realizando un programa que usa un JTable para mostrar una lista de proyectos de una empresa y permitir al usuario hacer doble click sobre ellos para editarlos. Una de las columnas, en concreto, muestra el icono del proyecto, una imagen definida como byte[]. El render que uso para mostrarla lo adjunto aquí:


public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column)
{
JLabel etiqueta = new JLabel();
if (value instanceof byte[])
{
etiqueta.setIcon(new ImageIcon((byte[]) value));
etiqueta.setHorizontalAlignment(JLabel.CENTER);
etiqueta.setHorizontalTextPosition(JLabel.CENTER);
etiqueta.setVerticalTextPosition(JLabel.BOTTOM);
}
return etiqueta;
}

Y no tiene más misterio, en principio. El Render se aplica cuando la celda recibe un valor de byte[], mostrando el icono. Sin embargo, me he dado cuenta de que ocurre algo que no había previsto: El JLabel no se selecciona. Bueno, sí. Pero no se "ilumina" en azul, como el resto de la fila. La razón me parece fácilmente deducible: Al ser un objeto en sí mismo, tiene su propio campo de Background, por lo cuál este no cambia al aplicarle la selección a la línea. El resultado, tanto de la línea sin seleccionar como de la línea seleccionada, es como se puede observar en esta imagen: http://fc03.deviantart.net/fs70/f/2012/335/0/f/icono_seleccion_1_by_kyrawaylaird-d5mov7d.png

¿Alguien tiene idea de como podría solventar esto? No es que sea un gran trauma, pero queda algo chapuzas que se ilumine todo menos la imagen...

noviembre 30, 2012 | Unregistered CommenterGuillermo

Ese método tiene un parámetro, isSelected, que puedes usar para cambiar el background del JLabel, en función del que usan las celdas de la JTable.

noviembre 30, 2012 | Registered Commenterchoces

@choces

Mil gracias, la verdad es que era algo de lo más obvio. Una de esas cosas que se te pasan por estar a diez otras historias a la vez

Le he añadido un simple


if (isSelected)
{
etiqueta.setOpaque(true);
float[] colores = new float[3];
Color.RGBtoHSB(22, 87, 100, colores);
etiqueta.setBackground(Color.getHSBColor(colores[0],colores[1],colores[2]));
}

al código, y ahora se me subraya. Lo que no tengo muy claro ahora es como hacer que se subraye del mismo color que el resto de la tabla, porque haciendo la chapuza esta se me queda un poco más verdoso que el original. Investigaré al respecto, a ver que saco

Muchas gracias de nuevo :)

noviembre 30, 2012 | Unregistered CommenterGuillermo

He tirado al final del ResourceMap de la aplicación. Ya se subraya. Que bonito queda, oigan

noviembre 30, 2012 | Unregistered CommenterGuillermo

Yo suelo usar esto en los renderers:

private static final Color selectForeground = UIManager.getColor("Table.selectionForeground");
private static final Color selectBackground = UIManager.getColor("Table.selectionBackground");
private static final Color background = UIManager.getColor("Table.background");

Así me aseguro de que si cambio el LaF de la aplicación, los colores sean consistentes.

noviembre 30, 2012 | Registered Commenterchoces