我正在尝试使用DefaultTableCellRenderer格式化JTable中的列。例如:如果用户输入:
20140914
格式为:
2014-09-14
我的代码如下:
//Setting data type for each class
//This is a method within the DefaultTableModel
public Class getColumnClass(int col)
{
if (col == 0)
return DateRenderer.class;
if (col == 1 || col == 2)
return String.class;
else
return Double.class;
}
//This is a separate class that I have problem with:
static class DateRenderer extends DefaultTableCellRenderer
{
//Using Decimal format to format dash
DecimalFormatSymbols fmtSymbols = new DecimalFormatSymbols();
fmtSymbols.setDecimalSeparator('-');
DecimalFormat fmt = new DecimalFormat("####.##.##");
public DateRenderer() {
super(); }
public void setValue(Object value)
{
setText (fmt.format(value));
}
}
代码存在两个问题。一个是我对这条线有问题:
fmtSymbols.setDecimalSeparator('-');
另一个是它会使我的整个列变得不可编辑(其他列仍然可以编辑和保存)。
答案 0 :(得分:3)
不要使用DecimalFormat渲染Date。相反,您应该使用SimpleDataFormat
。有关您可以使用的渲染器,请参阅Table Format Renderers。
另一个原因是它会使我的整个专栏变得不可编辑
渲染器无法控制列是否可编辑。这是isCellEditable(...)
方法的工作。
此外,您的getColumnClass(...)
实施错误。你不应该返回DateRender.class。相反,您应该返回列中存储的数据类,该类应该是Date.class
。
答案 1 :(得分:2)
“好吧,这只是一个设计目前处理yyyyMMdd的简单程序。我想一步一步,了解如何编程和格式化日期”
对于格式,您不应使用DecimalFormat
。而是使用DateFormat
。常用的子类是SimpleDateFormat
对于DefautTableCellRenderer
的当前实现,您缺少一个关键组件,它是getTableCellRendererComponent
的覆盖。您可以通过正确的方式查看How to use Renders。您还可以查看may questions。
至于覆盖getColumnClass()
,列类不应该是渲染器组件。您不必改为创建列类Date
并让Date
的默认渲染器为您进行渲染。您可以在Using Renderers查看更多信息。如果您不希望它为Date
并将其保留为String
,则渲染器应处理重新渲染为正确的格式。
至于处理输入无效输入的其他选项:
InputVerifier
作为单元格的编辑组件。您可以看到示例here以及many questions。 JSpinner
作为编辑器。请参阅many questions