2016-04-02 1 views
1

У меня есть JTable с четырьмя столбцами. Я пытаюсь центрировать выравнивание заголовка одного из этих столбцов. Я получил половину рабочего решения, но проблема в том, что по умолчанию рендеринг/стиль заголовка кажется потерянным. См. Снимок экрана. Я хотел бы получить текущий TableCellRenderer, изменить выравнивание заголовка в CENTER и применить адаптированный TableCellRenderer к определенному столбцу. Как я могу это сделать?Как изменить TableCellRenderer без потери рендеринга по умолчанию?

Скриншот таблицы

enter image description here

Мой JTable класс

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; 
     } 
    } 
} 
} 

Мой TableModel класс

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; 
    } 

} 

}

Мой TableCellRenderer класс

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; 
} 
} 
+1

И ваш код ... –

+0

пожалуйста, напишите код, как вам достигли того, что вы сделали, чтобы люди здесь могли вам помочь. – Blip

+0

по умолчанию заголовок текста появляется в центре. – Braj

ответ

2

Вместо расширения DefaultTableCellRenderer, делегат по умолчанию визуализатора в JTableHeader в:

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; 
    } 
} 
+0

благодарит меня за исправление. – Braj

+0

Спасибо за ответ! Это еще лучше. –

Смежные вопросы