2014-01-20 102 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

相關問題