覆盖 getColumnClass 不适用于日期列
Override getColumnClass not working for Date Columns
我在 Matlab 中使用 JIDE 网格排序和自动过滤功能。我已经覆盖了 getColumnClass 并且过滤和排序对整数、双精度和字符串列(按数字排序为数字,按词法分别为字符串排序)运行良好。
但是,我在日期列方面遇到了一个重大问题。我已覆盖 getColumn class 并定义为 Date.class。但我认为我必须定义将日期(如原始数据)传递给过滤和排序的格式,以便它理解格式并正常工作。
我看到 JIDE 自动过滤中的默认日期格式是“2016 年 4 月 7 日”。我曾尝试将我的数据转换为相同的格式,但没有成功。如果我尝试过滤日期,它会抛出 (Unknown Source) 异常。我认为它不理解我的日期格式。覆盖日期列的 class 时如何定义日期格式?
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 class,它覆盖了 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.
中的常规 classes
I see default date format in JIDE Autofiltering is '07-Apr-2016'.
对我来说,这看起来像一个字符串。如果您希望该列包含一个 Date
,那么您需要在 TableModel
中存储一个 Date
对象,而不是日期的字符串表示形式。
然后您通常会向 table 添加自定义呈现器以以适当的格式显示日期。
例如:
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);
}
}
您还可以查看 Table Format Renderers,其中包含可重复使用的渲染器,您只需向渲染器提供 Format 对象即可使用。这将节省您为所需的每种数据格式创建唯一渲染器的时间。
编辑:
I guess I have to use FormatConverter of some sort to do that
您可以使用 SimpleDateFormat
class 和 parse(String) 方法将字符串解析为日期对象。
异常表示:java.util.Date 无法转换为 java.lang.String。这意味着,就像 Camickr 指出的那样,日期实际上是作为字符串存储在我的 TableModel 而不是 Date 对象中。我使用 SimpleDateFormat class 将字符串转换为日期对象。为了其他新手 java 学习者的利益,下面是执行此操作的代码片段。
import javax.swing.table.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MyTableModel extends DefaultTableModel{
public MyTableModel(Object rowData[][], Object columnNames[]){
super(rowData, columnNames);
String ExpectedDateFormat = (String) ("dd/mm/yyyy");
SimpleDateFormat format = new SimpleDateFormat(ExpectedDateFormat);
Date strToDate = null;
for (int i=0; i<rowData.length;i++){
String DateStr = (String) super.getValueAt(i,3);
try {
strToDate = format.parse(DateStr);
// System.out.println(strToDate);
} catch (ParseException e) {
// e.printStackTrace();
}
super.setValueAt(strToDate,i,3);
}
}
@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;
}
}
}
日期数据在uitable中的显示可以使用与上述Camickr相同的class(SimpleDateFormat)来控制。
我后来发现的另一个帖子解释并解决了同样的问题:HERE
我在 Matlab 中使用 JIDE 网格排序和自动过滤功能。我已经覆盖了 getColumnClass 并且过滤和排序对整数、双精度和字符串列(按数字排序为数字,按词法分别为字符串排序)运行良好。
但是,我在日期列方面遇到了一个重大问题。我已覆盖 getColumn class 并定义为 Date.class。但我认为我必须定义将日期(如原始数据)传递给过滤和排序的格式,以便它理解格式并正常工作。
我看到 JIDE 自动过滤中的默认日期格式是“2016 年 4 月 7 日”。我曾尝试将我的数据转换为相同的格式,但没有成功。如果我尝试过滤日期,它会抛出 (Unknown Source) 异常。我认为它不理解我的日期格式。覆盖日期列的 class 时如何定义日期格式?
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 class,它覆盖了 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.
中的常规 classesI see default date format in JIDE Autofiltering is '07-Apr-2016'.
对我来说,这看起来像一个字符串。如果您希望该列包含一个 Date
,那么您需要在 TableModel
中存储一个 Date
对象,而不是日期的字符串表示形式。
然后您通常会向 table 添加自定义呈现器以以适当的格式显示日期。
例如:
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);
}
}
您还可以查看 Table Format Renderers,其中包含可重复使用的渲染器,您只需向渲染器提供 Format 对象即可使用。这将节省您为所需的每种数据格式创建唯一渲染器的时间。
编辑:
I guess I have to use FormatConverter of some sort to do that
您可以使用 SimpleDateFormat
class 和 parse(String) 方法将字符串解析为日期对象。
异常表示:java.util.Date 无法转换为 java.lang.String。这意味着,就像 Camickr 指出的那样,日期实际上是作为字符串存储在我的 TableModel 而不是 Date 对象中。我使用 SimpleDateFormat class 将字符串转换为日期对象。为了其他新手 java 学习者的利益,下面是执行此操作的代码片段。
import javax.swing.table.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MyTableModel extends DefaultTableModel{
public MyTableModel(Object rowData[][], Object columnNames[]){
super(rowData, columnNames);
String ExpectedDateFormat = (String) ("dd/mm/yyyy");
SimpleDateFormat format = new SimpleDateFormat(ExpectedDateFormat);
Date strToDate = null;
for (int i=0; i<rowData.length;i++){
String DateStr = (String) super.getValueAt(i,3);
try {
strToDate = format.parse(DateStr);
// System.out.println(strToDate);
} catch (ParseException e) {
// e.printStackTrace();
}
super.setValueAt(strToDate,i,3);
}
}
@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;
}
}
}
日期数据在uitable中的显示可以使用与上述Camickr相同的class(SimpleDateFormat)来控制。
我后来发现的另一个帖子解释并解决了同样的问题:HERE