问题描述
我正在Matlab中使用JIDE网格排序和自动过滤功能.我已经覆盖了getColumnClass,并且过滤和排序对于整数,双精度和字符串列(分别对数字进行数字排序和对字符串进行按词法排序)工作都很好.
I am using JIDE grids Sorting and Autofiltering capability in Matlab. I have overridden the getColumnClass and filtering and sorting is working well for Integers, Double and String Columns (sorting numerically for numbers and lexically respectively for strings).
但是,我在日期"列中遇到了主要问题.我重写了getColumn类,并将其定义为Date.class.但是我认为我必须定义将日期(如原始数据中)传递给过滤和排序"的格式,以便它了解格式并正常工作.
However, I am facing a major issues with Date columns. I have overridden getColumn class and defined as Date.class. But I think I have to define the format in which the dates (as in raw data) are being passed to Filtering and Sorting for it to understand the format and work properly.
我看到JIDE自动筛选中的默认日期格式为'2016年4月7日'.我尝试将数据转换为相同的格式,但是没有运气.如果我尝试过滤日期,则会引发(未知源)异常.我认为它不理解我的日期格式.覆盖日期列的类时如何定义日期格式?
I see default date format in JIDE Autofiltering is '07-Apr-2016'. I have tried converting my data to same format but no luck. If I try to filter the dates, it throws (Unknown Source) exception. I think it does not understand my date format. How can I define the date format when overriding the class for Date column?
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException:
java.util.Date cannot be cast to java.lang.String
at java.lang.String.compareTo(Unknown Source)
at com.jidesoft.filter.LessThanFilter.isValueFiltered(Unknown Source)
at com.jidesoft.grid.FilterableTableModel.shouldBeFiltered(Unknown Source)
这是我的TableModel类,它重写DefaultTableModel.
Here is my TableModel class that overrides DefaultTableModel.
import javax.swing.table.*;
import java.util.Date;
class MyTableModel extends DefaultTableModel {
public MyTableModel(Object rowData[][], Object columnNames[]) {
super(rowData, columnNames);
}
@Override
public Class getColumnClass(int col) {
switch (col){
case 0:
return Integer.class;
case 1: case 2: case 9:
case 10: case 33:
return String.class;
case 3:
return Date.class;
default:
return Double.class;
}
}
@Override
public boolean isCellEditable(int row, int col) {
switch (col){
case 28: case 29: case 30: case 31: case 32:
return true;
default:
return false;
}
}
}
推荐答案
我对JIDE一无所知,所以我的所有评论都是针对JDK中的常规类的.
I don't know anything about JIDE so all my comments are for regular classes in the JDK.
在我看来,这就像一个弦乐.如果希望该列包含Date
,则需要在TableModel
中存储一个Date
对象,而不是日期的String表示形式.
That looks like a String to me. If you want the column to contain a Date
, then you need to store a Date
object in the TableModel
, not a String representation of a date.
然后,您通常将自定义渲染器添加到表中,以适当的格式显示日期.
Then you would typically add a custom renderer to the table to display the date in an appropriate format.
例如:
public class YMDRenderer extends DefaultTableCellRenderer
{
private Format formatter = new SimpleDateFormat("yy/MM/dd");
public void setValue(Object value)
{
// Format the Object before setting its value in the renderer
try
{
if (value != null)
value = formatter.format(value);
}
catch(IllegalArgumentException e) {}
super.setValue(value);
}
}
您还可以查看表格格式渲染器,其中包含可重用的渲染器,您只需将Format对象提供给渲染器即可使用.这将节省您为所需的每种数据格式创建唯一的渲染器.
You can also check out Table Format Renderers which contains reusable renderers you can use simply by providing a Format object to the renderer. This will save you creating unique renderers for each data format you want.
您可以使用SimpleDateFormat
类和parse(String)方法将String解析为Date对象.
You can use the SimpleDateFormat
class and the parse(String) method to parse the String to a Date object.
这篇关于重写getColumnClass对于日期列不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!