当我从数据库中获取数据时,它会将Date
作为04/01/2014 00:00:00
,并显示在JTable
上。
现在我想在桌子上只显示日期并丢弃时间。
我该怎么做?
编辑:
public Vector getDateCustomer(String name,String name1)throws Exception
{
Vector<Vector<String>> getdatecustomerVector = new Vector<Vector<String>>();
Connection conn = dbConnection();
pre1=conn.prepareStatement("select * from Debit where Date "
+ "between CDate(?) and CDate(?) order by Date ASC");
pre1.setString(1, name); // bind param 1
pre1.setString(2, name1); // bind param 2
ResultSet rs1 = pre1.executeQuery();
while(rs1.next())
{
Vector<String> getdatecustomer = new Vector<String>();
getdatecustomer.add(rs1.getString(1));
getdatecustomer.add(rs1.getString(2));
getdatecustomer.add(rs1.getString(3));
getdatecustomer.add(rs1.getString(4));
Date myDate=(Date)format.parse(rs1.getString(5).substring(0, 10));
getdatecustomer.add(format.format(myDate));
getdatecustomer.add(rs1.getString(6));
getdatecustomerVector.add(getdatecustomer);
}
/*Close the connection after use (MUST)*/
if(conn!=null)
conn.close();
return getdatecustomerVector;
}
这就是我从数据库中获取值的方法。
获取错误
java.text.ParseException: Unparseable date: "2014-01-01"
at java.text.DateFormat.parse(DateFormat.java:357)
at shop.DBEngine.getDateCustomer(DBEngine.java:548)
at shop.DCSTable.<init>(DCSTable.java:127)
at shop.DCS.actionPerformed(DCS.java:273)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2713)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
at java.awt.EventQueue.access$000(EventQueue.java:101)
at java.awt.EventQueue$3.run(EventQueue.java:666)
at java.awt.EventQueue$3.run(EventQueue.java:664)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:680)
at java.awt.EventQueue$4.run(EventQueue.java:678)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
答案 0 :(得分:5)
基于原始问题
你可以做两件事。
Date.class
。 JTable
的默认行为是获取对象toString
结果并将其显示在单元格内。例如
public class DateTableCellRenderer extends DefaultTableCellRenderer {
protected static final DateFormat DATE_FORMAT = new SimpleDateFormat("dd/MM/yyyy");
private DateFormat format;
public DateTableCellRenderer() {
this(DATE_FORMAT);
}
public DateTableCellRenderer(DateFormat format) {
this.format = format;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (value instanceof Date) {
value = format.format((Date)value);
}
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
return this;
}
}
请查看How to use tables,特别是Using Custom Renderers了解更多详情
应用此渲染器的最佳方法可能是将其设置为特定类类型的默认渲染,在此java.util.Date
中,或者如果您知道它是java.sql.Date
。
table.setDefaultCellRenderer(Date.class, new DateTableCellRenderer());
这将假设TableModel
的{{1}}正在返回列的正确类类型。如果没有,那么您需要将渲染器直接设置为特定列...
getColumnClass
就个人而言,我更喜欢第二种选择......
基于更新的问题
不要更改来自数据库的数据类型,这些数据类型很重要,您实际上可能希望以某种超出table.getColumnModel().getColumn(indexOfDateColumn).setCellRenderer(new DateTableCellRenderer());
功能的方式与它们进行交互。
模型的目的是表示数据,模型不应该关注数据呈现的格式,事实上,您可以越多地保持数据的原始格式越好。
视图负责决定如何表示数据,在这种情况下,这是String
答案 1 :(得分:4)
然后你应该使用SimpleDateFormat
。例如:
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
String s = format.format(yourDate);
答案 2 :(得分:4)
您可以实施自己的TableCellRenderer
,可以扩展DefaultTableCellRenderer创建自定义DateCellRenderer
覆盖getTableCellRendererComponent()
。要格式化日期,请使用SimpleFormatDate。您可以为特定列或Date.class
的所有实例设置此渲染器。
更多信息请阅读官方教程Using Custom Renderers
答案 3 :(得分:2)
通过覆盖默认渲染器的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);
}
}
通过使用可重复使用的代码检查Table Format Renderers来利用此类渲染。然后你需要做的就是指定格式化程序:
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);
}
}
答案 4 :(得分:0)
我猜您使用的是DefaultTableModel
,Vector
使用了Vector
个Object
的{{1}}秒。您也可能使用ResultSet.getString(int column)
而不是ResultSet.getDate(int column)
。 getDate
方法返回java.sql.Date
对象,该对象没有时间数据。您可能还使用Object[][]
使用最简单的JTable
构造函数。
代替更灵活的AbstractTableModel
类。
所以,请采取以下步骤:
创建一个用Java表示行中数据的类。使用正确的数据类。不要默认为String
。对于此处的Date
,请使用java.sql.Date
。
使用getXXX
的相应ResultSet
方法。
将AbstractTableModel
扩展为新TableModel
个List
新班级。
让您的新TableModel
在其Class<?>
方法中返回正确的getColumnClass(int column)
。
正如其他响应者所建议的那样,如果Swing的默认设置不能为您提供服务,请编写自己的渲染器。
答案 5 :(得分:0)
替换:
Date myDate=(Date)format.parse(rs1.getString(5).substring(0, 10));
getdatecustomer.add(format.format(myDate));
通过
getdatecustomer.add(format.format(rs1.getDate(5)));
编辑:
我建议你,不要使用这种技巧。这个技巧在将来可能没用。请了解如何使用渲染器。并且只使用正确的TableCellRenderer,因为@MadProgrammer建议你。