2014-01-13 83 views
0

使用構建是否有人知道,以顯示在JTable的頭的圖標排序的好方法,在不排序功能的使用構建?顯示JTable中頭圖標排序沒有排序機制

的排序是由表模型(實際上是一個數據庫),而不是根據JTable本身來完成。這就是爲什麼圖標的自動顯示不起作用。也許一個可以插入一個虛擬RowSorter的,什麼也不做,反而使得分類圖標出現在哪裏?

我發現了一個更好的解決方案

我只是寫我自己的RowSorter的,這樣排序不會有什麼影響,但排序請求重定向模型代替。這樣的排序順序是由外觀顯示和感覺本身。一些僞:

import java.util.Collections; 
import java.util.LinkedList; 
import java.util.List; 
import javax.swing.RowSorter; 
import xyz.SortableTableModel; 

public class MyRowSorter<M extends SortableTableModel> extends RowSorter<M> { 

    private M tableModel; 
    private List<? extends SortKey> sortKeys = new LinkedList<>(); 

    public MyRowSorter(M tableModel) { 
     this.tableModel = tableModel; 
    } 

    @Override 
    public M getModel() { 
     return tableModel; 
    } 

    @Override 
    public void toggleSortOrder(int column) { 

     // redirecting sort request to model and modification of sortKeys 

     List<? extends SortKey> newSortKeys = ...; 
     setSortKeys(newSortKeys); 
    } 

    @Override 
    public int convertRowIndexToModel(int index) { 
     return index; // will always be the same 
    } 

    @Override 
    public int convertRowIndexToView(int index) { 
     return index; // will always be the same 
    } 

    @Override 
    public void setSortKeys(List<? extends SortKey> keys) { 
     if (keys == null) { 
      sortKeys = Collections.EMPTY_LIST; 
     } else { 
      sortKeys = Collections.unmodifiableList(keys); 
     } 
     fireSortOrderChanged(); 
    } 

    @Override 
    public List<? extends SortKey> getSortKeys() { 
     return sortKeys; 
    } 

    @Override 
    public int getViewRowCount() { 
     return tableModel.getRowCount(); 
    } 

    @Override 
    public int getModelRowCount() { 
     return tableModel.getRowCount(); 
    } 

    // no need for any implementation 
    @Override public void modelStructureChanged() { } 
    @Override public void allRowsChanged() { } 
    @Override public void rowsInserted(int firstRow, int endRow) { } 
    @Override public void rowsDeleted(int firstRow, int endRow) { } 
    @Override public void rowsUpdated(int firstRow, int endRow) { } 
    @Override public void rowsUpdated(int firstRow, int endRow, int column) { } 

} 
+0

您可以嘗試使用圖標行爲編寫自定義TableHeader渲染器。 – alex2410

+0

我試過了。但是這個解決方案的問題是,標題渲染器應該使用系統外觀。自定義渲染器顯然不會使用外觀和感覺(除了看起來像標籤或其他東西)。 – user3190008

+0

查看我的答案,它提供了默認的L&F和頭部裝飾解決方案。 – alex2410

回答

1

在這種情況下,你可以嘗試編寫自定義TableCellRendererJTableHeader

下面是渲染器的簡單的例子:

private static class MyRenderer implements TableCellRenderer { 

    private ImageIcon icon1; 
    private ImageIcon icon2; 
    private TableCellRenderer defaultRenderer; 

    MyRenderer(JTable t){ 
     defaultRenderer = t.getTableHeader().getDefaultRenderer(); 
     icon1 = new ImageIcon(getClass().getResource("1.png")); 
     icon2 = new ImageIcon(getClass().getResource("2.png")); 
    } 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) { 
     Component c = defaultRenderer.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, col); 
     if(col%2 == 0){ 
      ((JLabel)c).setIcon(icon1); 
     } else { 
      ((JLabel)c).setIcon(icon2); 
     } 
     return c; 
    } 
} 

這裏icon1icon2是您的排序圖標。

而且你可以設置渲染你的JTableHeader像下一個:

table.getTableHeader().setDefaultRenderer(new MyRenderer(table)); 

table - 是您JTable

+0

這是一個非常簡單的解決方案,但它有缺點: 1.您無法使用該列的自定義圖標了。它被佔用(用於)排序圖標。 2.標準排序機制與您剛寫入的自定義排序機制之間存在視覺差異。見下圖: – user3190008

+0

![差異圖片](http://www.pasteall.org/pic/show.php?id=65231)。默認行爲在底部,您的自定義解決方案位於頂部。 – user3190008

+0

我想,你可以嘗試在更復雜的渲染器的幫助下自己管理圖標的位置。 – alex2410

1

排序是由表模型(實際上是一個數據庫)而不是由JTable本身完成的。

查看DefaultRowSorter類。也許你使用setSortsOnUpdates(...)setSortKeys(...)所以排序圖標從數據庫中的排序相匹配。你可以嘗試:

  1. 創建一個空的模型
  2. 設置排序鍵
  3. 使用setSortsOnUpdates(false);
  4. 更新使用到setDataVector()(或等效的方法如果使用的是自定義模型)的模型

注意:此方法假定您已經創建了列名的TableModel的且沒有數據並添加模型到JTable 。我想,那麼你還需要使用:

table.setAutoCreateColumnsFromModel(false); 

防止的TableColumnModel從當您將數據加載到模型中被重建。

+0

其實我只是找到了一個非常類似的解決方案,並直接發佈在我的問題下。我只是實現了我自己的RowSorter,除了存儲SortKey並將排序請求重定向到TableModel之外,我們自己的RowSorter幾乎不做任何事情,而是進行實際的排序。 – user3190008