Estoy tratando de hacer que mi tabla seleccione una fila completa al hacer clic en una celda (lo que se puede hacer desactivando la columna de selección), pero, No quiero que el borde extra grueso alrededor de la celda específica en la que hizo clic esté resaltado. Tenía la esperanza de que esto sería fácil, pero al parecer se trata de extracción de grasas así que hice un montón de investigación y lo más cerca que puede obtener es la siguiente:Java - Swing - JTable - Establecer color para la fila seleccionada, pero no la celda
JTable contactTable = new JTable(tableModel);
contactTable.setCellSelectionEnabled(true);
contactTable.setColumnSelectionAllowed(false);
contactTable.setRowSelectionAllowed(false);
contactTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
// This renderer extends a component. It is used each time a
// cell must be displayed.
class MyTableCellRenderer extends JLabel implements TableCellRenderer {
// This method is called each time a cell in a column
// using this renderer needs to be rendered.
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex) {
// 'value' is value contained in the cell located at
// (rowIndex, vColIndex)
if (isSelected) {
// cell (and perhaps other cells) are selected
}
if (hasFocus) {
// this cell is the anchor and the table has the focus
this.setBackground(Color.blue);
this.setForeground(Color.green);
} else {
this.setForeground(Color.black);
}
// Configure the component with the specified value
setText(value.toString());
// Set tool tip if desired
// setToolTipText((String)value);
// Since the renderer is a component, return itself
return this;
}
// The following methods override the defaults for performance reasons
public void validate() {}
public void revalidate() {}
protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {}
public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {}
}
int vColIndex = 0;
TableColumn col = contactTable.getColumnModel().getColumn(vColIndex);
col.setCellRenderer(new MyTableCellRenderer());
copié muestra el procesador de un ejemplo y sólo ha cambiado la función hasFocus() para usar los colores que quería. Los colores de ajuste en isSelected()
no hicieron nada.
El problema con este código es:
que sólo funciona en una columna especificada por vColIndex en la parte inferior. Obviamente, quiero que esto se aplique a todas las columnas, por lo que al hacer clic en una celda en una se destaca toda la fila. Podría hacer un ciclo para cambiarlo a cada celda, pero creo que hay una forma mejor de hacerlo que cambie el CellRenderer para TODAS las columnas a la vez.
setForegroundColor()
trabaja para cambiar el texto perosetBackgroundColor()
no hace nada para el fondo de las celdas. Me gustaría que realmente cambie el color de fondo como lo implica la propiedad.- Solución para el n. ° 2: utilice
this.setOpaque(true);
antes de asignar color de fondo.
- Solución para el n. ° 2: utilice
Cuando el renderizador funciona, solo funciona en una sola Celda. ¿Cómo puedo hacer que coloree todas las celdas de la fila?
- Solución para # 3: ¡Lo descubrí! En lugar de usar
hasFocus()
, que solo afecta a la celda individual, si habilita la selección de fila (table.setRowSelectionAllowed(true)
), cambia el color en la declaraciónif(isSelected)
. ¡Entonces toda la fila se considera seleccionada y colorea todas las celdas!
- Solución para # 3: ¡Lo descubrí! En lugar de usar
3 fue la más grande, pero si alguien sabe # 1 o me puede explicar por qué se ha diseñado de tal manera que sólo se puede aplicar el procesador a una columna a la vez que sería muy apreciada.
Gracias por la respuesta. Intenté usar setSelectionBackground (Color) pero Eclipse lo marca como un método inexistente. – Daniel
En realidad me di cuenta de que la parte, edité la publicación original. – Daniel
Intenté el método setSelectionBackGround ahora y funciona. Cuando selecciono una o más filas, cambian sus colores. Pero tal vez entiendo mal lo que estás buscando. – mbaydar