【问题标题】:JTable date column sort freezesJTable 日期列排序冻结
【发布时间】:2011-10-06 20:10:03
【问题描述】:

我正在使用一个 JTable,其中包含一些具有不同数据类型(int、string、date)的列。当我运行应用程序时,数据显示正常,但如果我使用列标题对数据进行排序,它会冻结在包含 Date 对象的列上。下面是代码。第 8、9 和 10 列是导致问题的原因。如何使日期列可排序?

public void updateLogTable() {

    DefaultTableModel model = (DefaultTableModel) logTable.getModel();
    List<LogObject> lstLogObjects = new ArrayList<LogObject>();
    lstLogObjects = LogManager.getLog();
    for (int i = 0; i < lstLogObjects.size(); i++) {
        Object[] temp = new Object[13];

        temp[0] = Integer.parseInt(lstLogObjects .get(i).getLogID());
        temp[1] = lstLogObjects .get(i).getLogType();
        temp[2] = lstLogObjects .get(i).getYear();
        temp[3] = lstLogObjects .get(i).getQuarter();
        temp[4] = lstLogObjects .get(i).getOriginalID();
        temp[5] = lstLogObjects .get(i).getSubject();
        temp[6] = lstLogObjects .get(i).getAction();
        temp[7] = lstLogObjects .get(i).getRequester();
        temp[8] = lstLogObjects .get(i).getADate(); //Returns java.util.Date
        temp[9] = lstLogObjects .get(i).getCDate(); //Returns java.util.Date
        temp[10] = lstLogObjects .get(i).getSDate(); //Returns java.util.Date
        temp[11] = lstLogObjects .get(i).getRemarks();
        temp[12] = lstLogObjects .get(i).getField1();

        model.addRow(temp);

    }
    model.fireTableDataChanged();
 }

【问题讨论】:

  • getADate() 返回什么类型?
  • 对不起。我用 cmets 更新了代码。它返回 java.util.Date
  • @Woodszy 返回 System.out.println(lstLogObjects .get(i).getADate());类似于 Fri Jan 10 00:00:00 GTM 2010

标签: java swing jtable defaulttablemodel


【解决方案1】:

您是否覆盖了 TableModel 的 getColumnClass(...) 方法以返回正确的类?

然后,表格排序方法将对列进行排序并将其视为 Date,而不是在 Date 对象上调用 toString()。

如果您需要更多帮助,请发布您的 SSCCE 以说明问题。

【讨论】:

  • 谢谢。我使用 Netbeans 生成的代码来定义 JTable,因此定制表变得更加困难。但你的建议奏效了。
【解决方案2】:

我建议将 JXTable 用于比显示两列更简单的事情。基本介绍例如是here

其他选项是使用 Long 作为表格中的元素并使用列渲染器来格式化日期:

 temp[8] = lstLogObjects .get(i).getADate().getTime()

 table.getColumnModel().getColumn(8).setCellRenderer( new DefaultTableCellRenderer(){
    public Component getTableCellRendererComponent(JTable table, Object value,
                                        boolean isSelected, boolean hasFocus,
                                        int row, int column){
        Object value2 = value; 
        if(row>0 && column==8) //put your own condition here
             value2 = new Date((Long)value).toString(); //your own formatting here
        return super.getTableCellRendererComponent(table, value2,
                                          isSelected, hasFocus,
                                          row, column);
     }
  });
 }

【讨论】:

  • 每次要渲染单元格时,将 Long 变量持续转换为 Date 效率不是很高。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
  • 2021-10-03
  • 2023-03-29
  • 1970-01-01
相关资源
最近更新 更多