2014-01-20 62 views
0

已经存在一个jtable,我需要动态添加一列,然后为该列设置表格单元格渲染器,单元格渲染器带有图标的jlabel。我已经完成了。如何根据在jtable中动态添加的列对行进行排序?

我的问题是:现在我需要根据表格单元格渲染器中使用的不同图标对列进行排序,那么该怎么做?谢谢。

有相关的代码:

JTable table;// the table is already existed, I cannot change it 

    TableColumn column = new TableColumn(); 

    column.setHeaderValue("Icon"); 
    column.setCellRenderer(new IconCellRenderer()); 

    table.addColumn(column); 


public class IconCellRenderer extends DefaultTableCellRenderer 
{ 
    private static final long serialVersionUID = 1L; 

    public IconCellRenderer() 
    { 
    super(); 
    } 

    @Override 
    public Component getTableCellRendererComponent(JTable pTable, Object pValue, 
     boolean pIsSelected, boolean pHasFocus, int pRow, int pColumn) 
    { 
    JLabel label = new JLabel(); 


    if (checkCondition(..)) 
    { 
     label.setIcon(iconOne); 
    } 
    else 
    { 
     label.setIcon(iconTwo)); 
    } 

    label.setHorizontalAlignment(SwingConstants.CENTER); 

    return label; 
    } 

} 
+0

发布一些代码或描述你已经尝试过的内容会帮助你获得答案。 – user2314737

回答

1

对于目的,你可以使用TableRowSorter,并设置Comparator所需列。在这种比较可以比较细胞的价值观和对它们进行排序:

TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model); 
sorter.setComparator(0, new Comparator<Object>() { 

    @Override 
    public int compare(Object o1, Object o2) { 
     return 0; 
    } 
}); 
table.setRowSorter(sorter); 

table是你JTablemodel是你的表的模式。

JTable中阅读更多关于sorting

+0

谢谢了,我还是很困惑,在表模型中,没有为Icon元素返回的值,我用表格单元格渲染器来设置图标,所以在比较方法中,o1和o2会有值吗?如果他们这样做,他们会成为JLabel或Icon的实例吗?它会继续工作吗?无论如何,我会试一试。 – Jason

+0

o1和o2是来自TableModel的值,因为它们不会是'JLabel'或'Image',它们将是来自单元格的值,您可以使用来自Renderer的'checkCondition(..)'方法来确定comparrator。 – alex2410

+0

嗨亚历克斯,我试图按照你的建议,但有一个问题,我得到了异常:java.lang.IndexOutOfBoundsException:列超出范围TableModel。 我认为这个列是动态添加的,表模型没有改变。 – Jason

相关问题