在JTable header 上设置自定义渲染器时,我得到了预期的视觉行为(边框,字体,对齐方式...),但是我无法获得通常在对行进行排序时出现的LaF排序图标。
这是用于设置自定义 header 渲染器的代码:
Enumeration<TableColumn> columns = getColumnModel().getColumns();
while (columns.hasMoreElements())
columns.nextElement().setHeaderRenderer(new XDeliveryTableHeaderRenderer());
这是自定义 header 渲染器的摘录:
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;
}
}
有什么提示吗?
最佳答案
尝试委派给安装了L&F的渲染器:
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()));
如kleopatra警告,这可能不是最稳定的解决方案,请参阅我刚在生产中使用的this bug report。该问题的报告者建议使用自定义Table/TableColumn子类,这些子类将更新TableColumn#getDefaultRenderer中的委托(delegate)渲染器。