2011-10-17 16 views
9

Si bien la creación de un intérprete personalizado en un encabezado de JTable consigo el comportamiento visual esperado (fronteras, fuente, alineación, ...) pero no puedo manejar para obtener los iconos de clasificación que LaF generalmente aparecen cuando las filas están ordenadas.JTable, procesador de encabezados personalizados y clasificación de iconos

Este es el código para configurar el procesador de cabecera personalizada:

Enumeration<TableColumn> columns = getColumnModel().getColumns(); 
    while (columns.hasMoreElements()) 
    columns.nextElement().setHeaderRenderer(new XDeliveryTableHeaderRenderer()); 

Este es un extracto del procesador de encabezados personalizado:

public class MyTableHeaderRenderer extends JLabel implements TableCellRenderer { 
    private static final Font labelFont = new Font("Arial", Font.BOLD, 11); 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     setFont(labelFont); 
     setHorizontalAlignment(SwingConstants.CENTER); 
     setText(value.toString()); 
     setBorder(BorderFactory.createEtchedBorder()); 
     return this; 
    } 
} 

¿Alguna pista?

Respuesta

12

Trate delegando en el L & F instalado procesador:

public class MyTableHeaderRenderer implements TableCellRenderer { 
private static final Font labelFont = new Font("Arial", Font.BOLD, 11); 

private TableCellRenderer delegate; 

public MyTableHeaderRenderer(TableCellRenderer delegate) { 
    this.delegate = delegate; 
} 

@Override 
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 

    Component c = delegate.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

    if(c instanceof JLabel) { 
     JLabel label = (JLabel) c; 
     label.setFont(labelFont); 
     label.setHorizontalAlignment(SwingConstants.CENTER); 
     label.setBorder(BorderFactory.createEtchedBorder()); 
    } 
    return c; 
} 
} 

// Usage: 
JTableHeader header = table.getTableHeader(); 
header.setDefaultRenderer(new MyTableHeaderRenderer(header.getDefaultRenderer())); 

Como kleopatra advirtió, esto podría no ser la solución más estable, ver this bug report la que acabo de recibir en la producción. El reportero de ese problema sugiere usar una subclase Table/TableColumn personalizada que actualice el renderizador delegado en TableColumn # getDefaultRenderer.

+0

Desafortunadamente eso no hace el truco. La extensión de JLabel y la implementación de TableCellRenderer dieron como resultado un encabezado con el mismo color de fondo y sin borde (de ahí la necesidad de establecer explícitamente el borde). La solución que sugirió (llamada a través de .... setHeaderRenderer (nueva MyTableHeaderRenderer (nueva DefaultTableCellRenderer()))) creado una cabecera con un fondo blanco y todavía no hay iconos de clasificación - sin embargo, con la mecánica de clasificación sigue trabajando. – s3lvatico

+1

Ah perdón olvidé, en lugar de pasar nueva DefaultTableCellRenderer() necesita pasar table.getTableHeader(). GetDefaultRenderer(). –

+0

debidamente observado, probado, probado, apreciado. Funcionó como un encanto, gracias :) – s3lvatico

Cuestiones relacionadas