2

I have a JTable with four columns. I'm trying to center align the header of one of those columns. I got a half working solution but the problem is that the default rendering/style of the header seems to be lost. See screenshot. I would like to get the current TableCellRenderer, change the header alignment to CENTER and apply the adapted TableCellRenderer to a specific column. How can I do this?

Screenshot of the table

enter image description here

My JTable class

public class MyTable extends JTable {

public MyTable() {
    String[] headers = { "Parent", "Summary", "Key", "Processed" };
    MyTableModel model = new MyTableModel(headers);

    Object[] testrow = { "TST-99999", "S", "K", false };
    model.addRow(testrow);

    setModel(model);

    Enumeration<TableColumn> columns = getColumnModel().getColumns();
    while (columns.hasMoreElements()) {
        TableColumn column = (TableColumn) columns.nextElement();
        System.out.println(column.getHeaderValue());
        column.setResizable(false);
        switch ((String) column.getHeaderValue()) {
        //case "Parent":
        //case "Key":
        case "Processed":
            column.setMaxWidth(80);
            column.setMinWidth(80);
            column.setHeaderRenderer(new CenterRenderer());
            break;
        }
    }
}
}  

My TableModel class

public class MyTableModel extends DefaultTableModel {

public MyTableModel(String[] headers) {
    for(String header:headers){
        addColumn(header);
    }
}

@Override
public boolean isCellEditable(int row, int column) {
   return false;
}


@Override
public Class<?> getColumnClass(int index) {
    switch (index) {
    case 0:
        return String.class;
    case 1:
        return String.class;
    case 2:
        return String.class;
    case 3:
        return Boolean.class;
    default:
        return String.class;
    }

}

}

My TableCellRenderer class

public class CenterRenderer extends DefaultTableCellRenderer {
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    label.setHorizontalAlignment(SwingConstants.CENTER);
    return label;
}
}
Braj
  • 46,415
  • 5
  • 60
  • 76
  • please post the code how you have achieved what you have done so that people out here can help you. – Blip Apr 02 '16 at 13:52
  • by default header text appears in the center. – Braj Apr 02 '16 at 13:53
  • Relevant [post](http://stackoverflow.com/questions/9851253/how-to-use-renderer-for-tableheader) Just for your reference. – Braj Apr 02 '16 at 14:31

1 Answers1

3

Instead of extending DefaultTableCellRenderer, delegate to the JTableHeader's default renderer:

public class CenterRenderer implements TableCellRenderer {
    private final JTableHeader header;

    public CenterRenderer(JTableHeader header) {
        this.header = header;
    }

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        JLabel label = (JLabel) header.getDefaultRenderer().getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        label.setHorizontalAlignment(SwingConstants.CENTER);
        return label;
    }
}
VGR
  • 40,506
  • 4
  • 48
  • 63