java - pintar - Swing: TableCellRenderer que usa negrita para algunas de las celdas
pintar celda jtable java (5)
Pregunta simple, pero parece que no puedo encontrar la respuesta en línea.
¿Cómo se usa un TableCellRenderer personalizado para representar algunas de las celdas de la tabla en negrita?
Sé cómo usar TableCellRenderer para establecer el color de fondo celda por celda. Usted hace algo como:
public class MyTableCellRenderer extends DefaultTableCellRenderer
{
@Override public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
Component c = super.getTableCellRendererComponent(table, value,
isSelected, hasFocus, row, column);
// modify the component "c" to have whatever attributes you like
// for this particular cell
}
}
Asumiría que cambiar el estilo del texto de representación es similar, pero ¿cómo se establece que la fuente sea la misma que la fuente de la tabla predeterminada, pero en negrita?
Aquí está el enfoque del perezoso: use DefaultTableCellRenderer
(que es una subclase de JLabel
) y use HTML para especificar cuándo desea usar un tipo de letra en negrita.
No será tan eficaz como definir tu propio renderizador personalizado y controlar las fuentes directamente, pero el código generalmente es más compacto, por lo que es bueno para aplicaciones simples.
/**
* Renderer implementation for rendering Strings.
* Strings beginning with ''A'' are rendered in bold.
*/
public class MyRenderer extends DefaultTableCellRenderer {
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
String txt = String.valueOf(value);
if (txt != null && txt.startsWith("A")) {
// Reassign value as an HTML string.
// Obviously need to consider replacing HTML special characters
// if doing this properly.
value = String.format("<body><b>%s</b></body>", txt);
}
// Delegate to superclass which will set the label text, background, etc.
return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
}
}
Es posible que también desee considerar el Enfoque de Renderización de Fila de Tabla, que puede darle un poco más de flexibilidad para controlar las celdas para las que cambia la fuente. Lo he usado para doblar el texto en todas las columnas de la fila seleccionada.
Establecer la fuente en negrita con el almacenamiento en caché, como se describe aquí, funcionará.
En caso de que necesite establecer solo una parte del texto en negrita, use HTML. Los renderizadores de celdas de tabla se basan en JLabel
(o puede devolver uno). Convirtiendo su texto a html permitirá casi cualquier cambio de atributo de texto.
Usamos esta técnica ampliamente y no observamos ninguna degradación significativa del rendimiento.
Si ya puede obtener la fuente de tabla predeterminada (que supongo que sería c.getFont()
), simplemente use deriveFont(Font.BOLD)
en ella.
puedes usar esto también ...
class SampleRenderer extends DefaultTableCellRenderer
{
public Component getJtableCellRendererComponent(Jtable table,Object value,boolean isSelected , boolean hasFocus , int row, int column)
{
JLabel c = (JLabel)super.getJtableCellRendererComponent(table,value,isSelected ,hasFocus , row, column);
Font f = c.getFont();
c.setFont(f.getName(),Font.BOLD,f.getSize()));
return c;
}
}