Java AbleCellRenderComponent()。和用于格式化日期。您可以为特定列或Date.class的所有实例设置此渲染器
更多信息阅读官方教程我猜您使用的是Java AbleCellRenderComponent()。和用于格式化日期。您可以为特定列或Date.class的所有实例设置此渲染器,java,swing,date,jtable,Java,Swing,Date,Jtable,更多信息阅读官方教程我猜您使用的是DefaultTableModel,它使用向量的向量对象的向量。您可能还使用了ResultSet.getString(int列)而不是ResultSet.getDate(int列)。方法返回一个没有时间数据的java.sql.Date对象。您还可以使用最简单的JTable构造函数来使用对象[][] 将更灵活的AbstractTableModel类改为子类 因此,采取以下步骤: 创建一个用Java表示行中数据的类。为数据使用正确的类。不要默认为字符串。对于这里的D
DefaultTableModel
,它使用向量的向量
对象的向量。您可能还使用了ResultSet.getString(int列)
而不是ResultSet.getDate(int列)
。方法返回一个没有时间数据的java.sql.Date
对象。您还可以使用最简单的JTable
构造函数来使用对象[][]
将更灵活的AbstractTableModel
类改为子类
因此,采取以下步骤:
创建一个用Java表示行中数据的类。为数据使用正确的类。不要默认为字符串
。对于这里的Date
,使用java.sql.Date
table.setDefaultCellRenderer(Date.class, new DateTableCellRenderer());
使用ResultSet
的相应getXXX
方法
将AbstractTableModel
扩展到一个新的TableModel
,它获取新类的列表
让新的TableModel
在其getColumnClass(int column)
方法中返回正确的Class
正如其他响应者所建议的,如果Swing的默认设置不能满足您的需要,请编写自己的渲染器
替换:
Date myDate=(Date)format.parse(rs1.getString(5).substring(0, 10));
getdatecustomer.add(format.format(myDate));
借
编辑:
我建议你,不要用这种伎俩。这个技巧在将来可能不会有用。请学习如何使用渲染器。并且按照@MadProgrammer的建议,只使用适当的TableCellRenderer 通过覆盖默认渲染器的setValue()方法创建一个简单的渲染器:
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);
}
}
要通过使用可重用代码利用这种类型的呈现,请签出。然后,只需指定格式化程序:
SimpleDateFormat format = new SimpleDateFormat("yy/MM/dd");
TableCellRenderer renderer = new FormatRenderer( format );
编辑:
如nachokk所述,如果要创建完全自定义的渲染器,可能需要使用instanceof检查以确保设置了正确的类格式:
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
if (value instanceof Date)
{
value = formatter.format(value);
}
super.setValue(value);
}
}
最好的方法是使用TableCellRenderer
很高兴看到您取得了进展,但编辑使其成为一个完全不同的问题!请回答这个问题,并开始一个与ParseException
相关的新问题。查看TableModel
接口及其Class getColumnClass(int column)
方法。否-不要在模型中存储字符串表示(格式化或非格式化):这是渲染器的任务!我只是给他一个解决问题的窍门。可能他无法处理TableCellRenderer可能他无法处理TableCellRenderer
——如果人们只是给你一些技巧,而不是解决问题的正确方法,你该如何学习?模型的目的是保存原始的、未格式化的数据。您永远不知道应用程序将来需要如何与这些数据交互。视图的目的是格式化/显示数据,这是决定如何更改数据的地方,在这种情况下,这是TableCellRenderer
的责任。短期黑客总是回来咬你的屁股。空抓?如果发生异常,super.setValue
中的value
的值是多少?@nachokk,则将使用传递到方法中的值,默认渲染器将只使用对象的toString()方法。同意,您通常没有空捕获,但是呈现程序应该显示一些内容,并且类似“无效格式”的消息可能不是合理的值。因此,通过使用空捕捉,您可以获得渲染器的默认行为。+1 mm我知道,这样您就不需要使用instanceof
,@nachokk是的,您是对的,在本例中,我可以检查Date的实例,因为它是特定渲染器的示例。我展示了FormatRenderer类的基本代码。该类是用于使用任何格式对象的通用类,因此要呈现的值可以是日期、数字、字符串。。。因此,处理IllegalArguementException只是处理任何格式的一般方法。那么唯一需要更改的代码就是格式。
table.getColumnModel().getColumn(indexOfDateColumn).setCellRenderer(new DateTableCellRenderer());
Date myDate=(Date)format.parse(rs1.getString(5).substring(0, 10));
getdatecustomer.add(format.format(myDate));
getdatecustomer.add(format.format(rs1.getDate(5)));
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);
}
}
SimpleDateFormat format = new SimpleDateFormat("yy/MM/dd");
TableCellRenderer renderer = new FormatRenderer( 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
if (value instanceof Date)
{
value = formatter.format(value);
}
super.setValue(value);
}
}