使用DefaultTableCellRenderer在JTable中指定列类

时间:2014-05-13 01:55:33

标签: java swing jtable defaulttablemodel

我正在尝试使用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('-');

另一个是它会使我的整个列变得不可编辑(其他列仍然可以编辑和保存)。

2 个答案:

答案 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
    • 您甚至可能希望在单元格的编辑器中使用某种日期选择器组件。您可以看到许多相关的questions here
    • 您可能希望使用JSpinner作为编辑器。请参阅many questions