2011-10-17 32 views
9

Khi đặt trình kết xuất tùy chỉnh trên tiêu đề JTable, tôi nhận được hành vi hình ảnh mong muốn (đường viền, phông chữ, căn chỉnh, ...) nhưng tôi không thể quản lý để nhận biểu tượng sắp xếp LaF thường xuất hiện khi các hàng được sắp xếp.JTable, biểu tượng sắp xếp đầu trang tùy chỉnh và biểu tượng phân loại

Đây là mã cho thiết lập các tiêu đề renderer tùy chỉnh:

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

Đây là một đoạn trích của các renderer tiêu đề tùy chỉnh:

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

Bất kỳ gợi ý?

Trả lời

12

Hãy thử phân cấp cho L & F cài đặt 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())); 

Như Kleopatra cảnh báo, đây có thể không phải là giải pháp ổn định nhất, xem this bug report mà tôi chỉ có trong sản xuất. Phóng viên của vấn đề đó đề nghị sử dụng một lớp phụ Table/TableColumn tùy chỉnh mà cập nhật renderer đại biểu trong TableColumn # getDefaultRenderer.

+0

Thật không may là đã không thực hiện thủ thuật. Việc mở rộng JLabel và triển khai TableCellRenderer dẫn đến một tiêu đề có cùng màu nền và không có đường viền (do đó cần thiết phải đặt đường viền rõ ràng). Giải pháp bạn đề xuất (gọi là .... setHeaderRenderer (new MyTableHeaderRenderer (new DefaultTableCellRenderer()))) tạo một tiêu đề với nền trắng và vẫn không có biểu tượng sắp xếp - nhưng với cơ chế sắp xếp vẫn hoạt động. – s3lvatico

+1

Ah xin lỗi quên, thay vì đi qua DefaultTableCellRenderer mới() bạn cần phải vượt qua table.getTableHeader(). GetDefaultRenderer(). –

+0

Được ghi nhận, thử nghiệm, đánh giá, đánh giá cao. Nó hoạt động giống như một sự quyến rũ, cảm ơn :) – s3lvatico

Các vấn đề liên quan