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

时间:2010-12-27 13:10:20

标签: java swing jtable tablecellrenderer

//新手问题

我有一个带有几乎基本的单元格渲染器的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;

  }

4 个答案:

答案 0 :(得分:3)

按照@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 :(得分:1)

我使用包含 lot 数据的JTable进行了 lot 。超过99.9%的Java程序员通常操作。有一件事你需要知道:默认情况下,产生了大量的废物,并且通常不必要的操作就是疯狂的。

如果您正在使用快速高效的JTable,那么 权威的Sun文章就此主题发表:

“圣诞树应用程序,如何创建表现良好的经常更新的JTable”

注意标题中的“表现良好”,因为默认情况下JTable perfs真的非常糟糕:

Original Link (Sun)

Current link (Oracle)

Archived Version:

在实施了该文章中提到的两种或三种技术后,您会注意到JTable渲染的速度惊人,并且您会注意到生成的垃圾要少得多(因此GC需要不那么频繁地启动)

答案 2 :(得分:1)

我注意到您根据另一个单元格的值更改了单元格的外观。如果这种关系是双向的 - 单元格1外观基于单元格2,反之亦然,那么你可能会遇到这样的问题。但实际上,我们需要一个自包含的代码示例来重现问题 - 否则我们只能在黑暗中拍摄。

答案 3 :(得分:0)

渲染器已经缓存了渲染的组件,当没有任何变化时,没有任何东西被重新渲染

但是当表格检测到MIGHT已经改变时,它会请求重新渲染。 触发它的事件是鼠标移动。

所以它是JTable的正常行为。