2016-04-02 5 views
1

Ich habe eine JTable mit vier Spalten. Ich versuche, den Header einer dieser Spalten zu zentrieren. Ich habe eine halb funktionierende Lösung, aber das Problem ist, dass das Standard-Rendering/Stil der Kopfzeile verloren scheint. Siehe Screenshot. Ich möchte den aktuellen TableCellRenderer abrufen, die Kopfausrichtung auf CENTER ändern und den angepassten TableCellRenderer auf eine bestimmte Spalte anwenden. Wie kann ich das machen?Wie kann ich einen TableCellRenderer ändern, ohne das Standard-Rendering zu verlieren?

Screenshot der Tabelle

enter image description here

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

Meine Tablemodel Klasse

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

} 

}

Meine Table Klasse

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

Und der Code ist ... –

+0

bitte den Code schreiben, wie Sie habe erreicht, was du getan hast, damit Leute hier draußen dir helfen können. – Blip

+0

Standardmäßig wird der Headertext in der Mitte angezeigt. – Braj

Antwort

2

Statt DefaultTableCellRenderer auszudehnen, delegieren zu den Standard-Renderer des 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

danke für die Korrektur mich. – Braj

+0

Danke für die Antwort! Dieser ist noch besser. –

Verwandte Themen