JTable日期列排序冻结



我正在处理一个包含不同数据类型(int, string, date)的列的JTable。当我运行应用程序时,数据显示良好,但如果我使用列标题对数据进行排序,它会冻结在包含日期对象的列上。下面是代码。第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();
 }

是否重写了TableModel的getColumnClass(…)方法来返回适当的类?

表排序方法将对列进行排序,并将其作为Date处理,而不是在Date对象上调用toString()。

如果您需要更多帮助,请发布您的SSCCE演示问题。

我建议使用JXTable来显示比显示两列更简单的内容。基本的介绍是这样的。

另一个选择是使用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);
     }
  });
 }

最新更新