以下是我的代码片段:
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中编辑单元格数据是不可取的吗?
答案 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。