JTable,自定义标题渲染器和排序图标

s3l*_*ico 9 swing header jtable renderer

在JTable标头上设置自定义渲染器时,我得到了预期的可视行为(边框,字体,对齐方式......)但我无法获得通常在排序行时出现的LaF排序图标.

这是用于设置自定义标题渲染器的代码:

Enumeration<TableColumn> columns = getColumnModel().getColumns();
   while (columns.hasMoreElements())
   columns.nextElement().setHeaderRenderer(new XDeliveryTableHeaderRenderer());
Run Code Online (Sandbox Code Playgroud)

这是自定义标题渲染器的摘录:

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;
     }
}
Run Code Online (Sandbox Code Playgroud)

任何提示?

Wal*_*aan 12

尝试委托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()));
Run Code Online (Sandbox Code Playgroud)

正如kleopatra警告的那样,这可能不是最稳定的解决方案,请参阅我刚刚投入生产的这个错误报告.该问题的记者建议使用自定义的Table/TableColumn子类来更新TableColumn#getDefaultRenderer中的委托渲染器.

  • 这基本上是要走的路,只是一个小小的提示:标题渲染器依赖于LAF,它们的实现方式也各不相同.因此,a)简单的设置将无法在其生命周期中改变LAF,b)期望特定类型的_renderer_的LAF可能决定不正确配置组件c)排序图标可以驻留在任何地方,fi边框或占据标签的图标.所以期待未来的问题:-) (2认同)