很抱歉再次提出基本问题。作为java的新手,所以我认为最好采取指导而不是做一些愚蠢的事情。
在我的jtable中,我有以下数据
Id | Name | Date(month-year)
1 | XYZ | August-2014
2 | ABc | April-2014
我的Modelclass如下
class MyTableModel extends AbstractTableModel {
private String[] columnNames = {"Id", "Country","Date"};
public final Object[] longValues = {Integer.class,"",Date.class};
现在按照建议,我已经覆盖了模型表中的getColumnClass
@Override
public Class getColumnClass(int c)
{
if(c == 2)
{
//return Date.class;
return getValueAt(0,c).getClass();
}
else
return getValueAt(0,c).getClass();
}
我已启用默认列分拣机。
现在默认情况下,所有字符串列在短路时工作正常,但对于Date列,它也被视为字符串并将其缩短为字符串。
如果我强制列缩短为日期,则会给我错误。
我做错了什么,做错了什么。
由于
答案 0 :(得分:2)
按照建议,我已覆盖模型表中的
getColumnClass
请注意,您的实现是错误的,主要是因为您永远不必要求模型的值来获取列的类(更不用说冗余/无用的if-else
块)。既然您了解了模型,那么您完全有能力返回正确的列类而无需查询模型:
@Override
public Class<?> getColumnClass(int columnIndex) {
switch (columnIndex) {
case 0: return Integer.class; // Id column
case 1: return String.class; // Name column
case 2: return Date.class; // Date column
default: return super.getColumnClass(columnIndex);
}
}
这应该足以正确排序日期列,即使您的渲染器显示月 - 月模式:
table.setDefaultRenderer(Date.class, new DefaultTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (value instanceof Date) {
SimpleDateFormat formatter = new SimpleDateFormat("MMMM-yyyy");
value = formatter.format((Date)value);
}
return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
}
});
例如,如果您有9/27/2014
和9/30/2014
,那么当您对此列进行排序时,这应该是自然升序,无论两个单元格都显示September-2014
。
答案 1 :(得分:2)