当许多人使用相同的TableModel时,如何更新单个JTable

时间:2014-03-23 22:22:21

标签: java swing jtable tablecellrenderer tablemodel

我用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的监听器?或者,如果您认为这不是最佳解决方案,我该怎么办?

感谢您的时间=)

0 个答案:

没有答案