2014-01-13 37 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