JTable,自定义标题渲染器和排序图标 [英] JTable, custom header renderer and sorting icons

查看:142
本文介绍了JTable,自定义标题渲染器和排序图标的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

 枚举< TableColumn的> columns = getColumnModel()。getColumns(); 
while(columns.hasMoreElements())
columns.nextElement()。setHeaderRenderer(new XDeliveryTableHeaderRenderer());

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

  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){$ b $ setFont(labelFont);
setHorizo​​ntalAlignment(SwingConstants.CENTER);
setText(value.toString());
setBorder(BorderFactory.createEtchedBorder());
返回此;


$ / code $ / pre

$ p





$尝试委托L& F安装的渲染器:

  

> public class MyTableHeaderRenderer implements TableCellRenderer {
private static final Font labelFont = new Font(Arial,Font.BOLD,11);

私人TableCellRenderer委托;

public MyTableHeaderRenderer(TableCellRenderer delegate){
this.delegate = delegate;

$ b @Override
公共组件getTableCellRendererComponent(JTable表,Object值,boolean isSelected,布尔hasFocus,int行,int列){

Component c = delegate.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column);

if(c instance of JLabel){
JLabel label =(JLabel)c;
label.setFont(labelFont);
label.setHorizo​​ntalAlignment(SwingConstants.CENTER);
label.setBorder(BorderFactory.createEtchedBorder());
}
return c;
}
}

//用法:
JTableHeader header = table.getTableHeader();
header.setDefaultRenderer(new MyTableHeaderRenderer(header.getDefaultRenderer()));

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


While setting a custom renderer on a JTable header I get the expected visual behavior (borders, font, alignment, ...) but I can't manage to get the LaF sorting icons that usually appear when the rows are sorted.

This is the code for setting the custom header renderer:

Enumeration<TableColumn> columns = getColumnModel().getColumns();
   while (columns.hasMoreElements())
   columns.nextElement().setHeaderRenderer(new XDeliveryTableHeaderRenderer());

This is an excerpt of the custom header renderer:

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

Any hints?

解决方案

Try delegating to the L&F installed renderer:

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()));

As kleopatra warned, this might not be the most stable solution, see this bug report which I just got in production. The reporter of that issue suggest using a custom Table/TableColumn sub classes which updating the delegate renderer in TableColumn#getDefaultRenderer.

这篇关于JTable,自定义标题渲染器和排序图标的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆