java - texto - Anulando DefaultTableCellRenderer de JTable para centrar todas las celdas en una JTable
ajustar texto en jtable java (2)
Para aplicar la misma decoración visual a todos los componentes de renderizado (si eso es lo que realmente quiere, tenga cuidado, ¡podría tener una penalización de usabilidad!) Puede anular el métodoRenderer preparado por JTable:
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component comp = super.prepareRenderer(...);
if (comp instanceof JLabel) {
((JLabel) comp).setHorizontalAlignment(...);
}
return comp;
}
Por cierto: este enfoque está violando la regla a la subclase JSomething para las necesidades de la aplicación. Podría considerar usar SwingX, que es formalmente compatible con la decoración visual de los componentes de renderizado. Entonces, en lugar de crear subclases, registrarías un Resaltador con la tabla:
JXTable table = ...
table.addHighlighter(new AlignmentHighlighter(CENTER), HighlightPredicate.ALWAYS);
Tengo un problema del que no me puedo deshacer.
Para que lo sepas, soy bastante nuevo en el uso de JTables, por lo que la respuesta puede ser simple, pero no puedo encontrar una solución: /
Entonces, tengo una tabla JTable usando AbstractTableModel, que anula el
public Class<?> getColumnClass(int columnIndex_p)
método, para indicar el tipo de cada columna que se mostrará. Uno de ellos es un booleano.
Cuando creo una JTable simple, usando
table_l = new JTable(new MyTableModel());
todo está bien, y los valores booleanos se muestran correctamente usando casillas de verificación (activar / desactivar).
Ahora, me gustaría centrar el texto en cada celda (y posiblemente más opciones más adelante).
Así que defino un nuevo DefaultTableCellRenderer para cada columna, como este:
DefaultTableCellRenderer cellRenderer_l = new DefaultTableCellRenderer() {
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
// delegate the rendering part to the default renderer (am i right ???)
Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
return comp;
}
}
y luego simplemente configuro la alineación horizontal de este CellRender con:
cellRenderer_l.setHorizontalAlignment(JLabel.CENTER);
Luego instalo este nuevo CellRenderer en cada columna de JTable:
for (int i = 0; i < table_l.getColumnCount(); ++i) {
table_l.getColumnModel().getColumn(i).setCellRenderer(cellRenderer_l);
}
Pero, con el nuevo CellRenderer, el JTable que se muestra ya no usa el método getColumnClass () de mi TableModel y, por lo tanto, solo muestra la cadena "verdadero / falso" en los valores booleanos.
No sé cómo hacer para seguir usando getColumnClass () como antes.
Si alguien tiene la respuesta ... Gracias
EDITAR: gracias por todas las aclaraciones que hizo. De hecho, mi verdadera pregunta fue: "cómo afectar a todos los DefaultRenderer de una JTable para hacer que centren su resultado en las celdas de JTable"
El renderizador de celda predeterminado ya hace esto para los valores de tipo Boolean.class
, como se muestra aquí . Si esto no es suficiente, edite su pregunta para incluir una sscce que muestre cualquier problema que encuentre.
Adición: Si necesita personalizar aún más un DefaultTableCellRenderer
, especifique el procesador para el tipo aplicable usando setDefaultRenderer()
, como se muestra aquí .
table.setDefaultRenderer(Boolean.class, yourCellRenderer);