9

JTable ヘッダーにカスタム レンダラーを設定しているときに、期待どおりの視覚的動作 (境界線、フォント、配置など) が得られますが、行が並べ替えられたときに通常表示される LaF 並べ替えアイコンを取得できません。

これは、カスタム ヘッダー レンダラーを設定するためのコードです。

Enumeration<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) {
        setFont(labelFont);
        setHorizontalAlignment(SwingConstants.CENTER);
        setText(value.toString());
        setBorder(BorderFactory.createEtchedBorder());
        return this;
     }
}

ヒントはありますか?

4

1 に答える 1

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

kleopatra が警告したように、これは最も安定したソリューションではない可能性があります。本番環境で取得したばかりのこのバグ レポートを参照してください。その問題の報告者は、TableColumn#getDefaultRenderer でデリゲート レンダラーを更新するカスタム Table/TableColumn サブクラスを使用することを提案しています。

于 2011-10-17T13:52:13.080 に答える