我用12个JTable制作了一年的日历。对于他们我使用单个TableModel(AbstractTableModel的子类),我根本没有触及eventListeners。为此我:
1 - 将该TableModel的12个实例存储在数组中,如下所示:
for (int i = 0; i < monthQty; i++) {
days[i] = new MonthTableModel(i+1, year);
}
2 - 使用以下每个TableModel存储12个JTable实例:
for (int i = 0; i < monthTables.length; i++) {
monthTables[i] = new JTable();
monthTables[i].setDefaultRenderer(Object.class, new CustomCellRenderer());
...
monthTables[i].setModel(days[i]);
}
3 - 我的CustomCellRenderer检查dayList
应突出显示的日期:
private class CustomCellRenderer extends DefaultTableCellRenderer {
public Component getTableCellRendererComponent(
JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int column) {
Component c = super.getTableCellRendererComponent(table, value,
isSelected, hasFocus, row, column);
c.setFont(c.getFont().deriveFont(Font.PLAIN));
if (value != null) {
Iterator<Integer> it = dayList.iterator();
while (it.hasNext()) {
Integer temp = it.next();
if (value.toString().equals(temp.toString())) {
c.setFont(c.getFont().deriveFont(Font.BOLD));
}
}
}
return c;
}
}
此时我想让你注意到只有当我为窗口调用setVisible(true)
时才会调用渲染器,而不是在我创建JTable或设置它时,基本上是什么让我无法更新{每月之前{1}}(要突出显示的天数列表)放在其表格中。
我认为在绘制之后每个月更新一次会不那么难看,因为我会相应地更新dayList
,然后对每个表使用dayList
方法。
这种情况的结果是我最终在所有12个JTable上突出显示当天。
我相信有两个可能的原因。我所有表的事件监听器都是相同的,即使每个表都有不同的表模型,或者这个方法甚至在其他表上激发所有侦听器。
我尝试在Oracle的JTables教程中阅读这些监听器,但是没有足够的信息可用。我怎样才能只触发一个JTable的监听器?或者,如果您认为这不是最佳解决方案,我该怎么办?
感谢您的时间=)