【问题标题】:How to sort rows based on a column added dynamically in jtable?如何根据jtable中动态添加的列对行进行排序?
【发布时间】:2014-02-09 07:06:14
【问题描述】:

已经存在一个jtable,我需要动态添加一个列,然后为该列设置表格单元格渲染器,单元格渲染器是带有图标的jlabel。我已经完成了。

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

有相关代码:

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

}

【问题讨论】:

  • 发布一些代码或描述您已经尝试过的内容将帮助您获得答案。

标签: java swing jtable tablesorter


【解决方案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 的更多信息。

【讨论】:

  • 谢谢,我还是很困惑,在表格模型中,Icon单元格没有返回值,我使用表格单元格渲染器来设置图标,所以在比较方法中,将o1 和 o2 有价值吗?如果有,它们会是 JLabel 或 Icon 的实例吗?它还会起作用吗?不管怎样,我会试一试的。
  • o1 和 o2 将是来自 TableModel 的值,因为它们不会是 JLabelImage,它们将是来自您的单元格的值,您可以使用 Renderer 中的 checkCondition(..) 方法确定比较器的条件。
  • 嗨,Alex,我尝试按照您建议的方式进行操作,但是有一个问题,我遇到异常:java.lang.IndexOutOfBoundsException:列超出 TableModel 范围。我认为原因是列是动态添加的,表模型没有改变。
  • 代码:table.getColumnModel().addColumn(column); TableRowSorter sorter = new TableRowSorter(tablemodel); sorter.setComparator(table.getColumnCount() -1, new Comparator() { @Override public int compare(Object pO1, Object pO2) { System.out.println("po1:" + pO1); System.out .println("po2" + pO2); return pO1.toString().compareTo(pO2.toString()); } }); table.setRowSorter(sorter);
  • 我尝试在添加列后立即触发TableStructureChanged(),然后错过了该列。搜了一下发现table.getColumnModel().addColumn()会自己触发TableStructureChanged(),但是现在不行,不知道怎么办,各位有什么建议给我吗?谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-01-10
  • 2021-08-04
  • 1970-01-01
  • 2019-07-04
  • 1970-01-01
  • 1970-01-01
  • 2018-10-11
  • 2014-10-06
相关资源
最近更新 更多