在JTable中的prepareRenderer方法中编辑单元格数据是否可行且可取?

时间:2015-03-31 14:26:29

标签: java swing formatting tablecellrenderer

以下是我的代码片段:

public GUI(){         ...

    deadlinesAndTimeTasksTable = new JTable(deadlinesAndTimeTasksModel) {
        public Component prepareRenderer(TableCellRenderer renderer, int row, int column)
        {
            Component c = super.prepareRenderer(renderer, row, column);

            String dateTime;
            String deadline = (String) deadlinesAndTimeTasksTable.getValueAt(row, 4);
            if (!deadline.equals("- -")) {
                dateTime = deadline;
            } else {
                dateTime = (String) deadlinesAndTimeTasksTable.getValueAt(row, 3);
            }


            DateParser dp = new DateParser(dateTime);



            if (dp.getDateTimeInMilliseconds() < System.currentTimeMillis()) {
                String description = (String) deadlinesAndTimeTasksTable.getValueAt(row, 1) + "!!";
                setValueAt(description, row, 1)
                c.setForeground(Color.RED);

            } else {
                c.setForeground(Color.BLUE);
            }

            String status = (String) deadlinesAndTimeTasksTable.getValueAt(row, 5);

            if (status.equals("undone")) {

                c.setBackground(new Color(0,0,0,0));
                c.setFont(new Font("Arial", Font.BOLD, 12 ));
            } else {
                c.setBackground(new Color(0,180,150,30));


            }




            return c;
        }

    };

 ...
}

我想做的是追加一个角色,说&#34; !!&#34;如果任务的时间早于当前时间,则存储正在存储任务描述的单元格之一。但是,如果我使用setValueAt(description +&#34; !!&#34;,row,1)(1是存储描述的列),那么将会发生这种方法将一遍又一遍地被调用&#34; !!&#34;不断追加,以至于我有#34; !!!!! ........&#34;,导致我的程序最终崩溃。

我能知道导致问题的原因以及解决方法吗?

另一个问题是prepareRenderer应该只用于更改数据的格式,以便在prepareRenderer中编辑单元格数据是不可取的吗?

1 个答案:

答案 0 :(得分:1)

  

但是,如果我使用setValueAt ...

不要使用setValueAt(...),这会更新你已经注意到的TableModel。

默认渲染器是JLabel,因此您可以执行以下操作:

JLabel label = (JLabel)c;
label.setText(...);

这只会影响当前的渲染,而不会影响TableModel。

  

prepareRenderer仅用于更改数据的格式

通常,您可以使用自定义渲染器格式化数据。这是将值“123456789”的整数格式化为“123,456,789”或将日期格式化为YYYY-MM-DD的方式。

我唯一一次使用prepare renderer方法是用于行级别高亮显示。有关详细信息,请参阅Table Row Renderering