为什么我的JTable CellRenderer一直在运行?

//新手问题 我有一个带有几乎基本的单元格渲染器的JTable(它以不同的方式为线条着色)。 我注意到我的单元格渲染器一直在运行显示在屏幕上的线条,即使我对表格没有任何操作。 这是怎么回事?它不应该一次渲染每个细胞,就是这样吗? 我怎样才能让它停止,只在重新计算时重新计算?
public Component getTableCellRendererComponent(JTable table, Object value,
    boolean isSelected, boolean hasFocus, int row, int column) {

   log.debug("Building cell : " + row + "," + column);

   Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

   Filter filter = (Filter)table.getModel().getValueAt(row, Column.CLASSIFICATION.getIndex());
   comp.setBackground(filter.getColor());
   return comp;

  }
    
已邀请:
我已经使用了包含大量数据的JTables。超过99.9%的Java程序员通常操作。有一件事你需要知道:默认情况下,产生了大量的废物,并且通常不必要的操作就是疯狂的。 如果您正在使用快速高效的JTable,那么有关该主题的权威Sun文章: “圣诞树应用程序,如何创建经常更新的JTable,表现良好” 请注意标题中的“Perform Well”,因为默认情况下JTable perfs真的非常糟糕: 原始链接(太阳) 当前链接(Oracle) 存档版本: 在实现了该文章中提出的两种或三种技术之后,您会注意到JTable渲染的速度惊人,并且您会注意到生成的垃圾要少得多(因此GC需要不那么频繁地启动)。     
按照@Steve McLeod的提议,我开始构建一个带有相同bug的示例代码,然后才意识到我的一个CellRenderers
@Override
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {

        log.debug("Building a list for " + row + "," + column);
        setListData(((Vector<String>)value).toArray());     
        setToolTipText("This is a tool tip for " + row + "," + column);

        table.setRowHeight(row, Math.max(1, getPreferredSize().height));
        Filter filter = (Filter)table.getModel().getValueAt(row, Column.CLASSIFICATION_RESULT.getIndex());
        setBackground(filter.getColor());       
        return this;
    }
我有这条线:
table.setRowHeight(row, Math.max(1, getPreferredSize().height));
并且它不断改变行线,而同一行中的其他渲染器也做了相同的... 所以他们不断互相开火。     
我注意到你根据另一个单元格的值更改了单元格的外观。如果这种关系是双向的 - 单元格1外观基于单元格2,反之亦然,那么你可能会遇到这样的问题。但实际上,我们需要一个自包含的代码示例来重现问题 - 否则我们只能在黑暗中拍摄。     
渲染器已经缓存了渲染的组件,当没有任何变化时,任何东西都不会被重新渲染 但是,当表检测到MIGHT已更改时,它将请求重新呈现。 触发它的事件是鼠标移动。 所以是的,它是JTable的正常行为。     

要回复问题请先登录注册