swing - JTable、自定义标题渲染器和排序图标

标签 swing header jtable renderer

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

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

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

有什么提示吗?

最佳答案

尝试委托(delegate) 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)渲染器。

关于swing - JTable、自定义标题渲染器和排序图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7792586/

相关文章:

java - 使用键盘 ("AWT-EventQueue-0")

java - JTable:如何从绑定(bind)到数据源的表中获取选定对象

java - 如何在窗口上暂时阻止鼠标监听器?

java - 如何将 JTextField 转换为 int 并再次返回?

java - 如何在java中的递归函数中创建数组

javascript - 是否使用 php 或 javascript 方法来重定向页面

c++ - 函数原型(prototype)和函数实现签名不一致地使用 const 可以吗?

html - css 更有效率?更改箭头和标题的颜色

java - JTable 中的复选框始终返回 false,尽管已选中

来自数据库的 Java JTable 结果