4

//新手问题

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

4 回答 4

3

遵循@Steve McLeod 的提议,我开始构建具有相同错误的示例代码,直到那时我才意识到在我的一个 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));

并且它不断地改变行线,而同一行中的其他渲染器也做同样的事情......所以他们不断地互相射击。

于 2010-12-29T11:27:38.943 回答
2

我使用包含大量数据的 JTables 做了很多工作。超过 99.9% 的 Java 程序员通常操作的。您需要知道一件事:默认情况下,会产生大量浪费,并且通常会进行大量不必要的操作。

如果您追求快速高效的 JTables,那么这里有关于该主题权威 Sun 文章:

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

注意标题中的“that Perform Well”,因为默认情况下,JTable 性能非常非常糟糕:

原始链接(太阳)

当前链接(甲骨文)

存档版本:

在实施了该文章中建议的两三个技术之后,您会注意到 JTable 渲染的惊人加速,并且您会注意到生成的垃圾少得多(因此 GC 需要更少地启动)。

于 2010-12-27T15:04:19.303 回答
1

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

于 2010-12-27T17:18:18.170 回答
0

渲染器已经缓存了您渲染的组件,当没有任何变化时,不会重新渲染

但是,当表检测到某些内容可能已更改时,它将请求重新渲染。触发它最多的事件是鼠标移动。

所以是的,它是 JTable 的正常行为。

于 2010-12-27T13:25:17.430 回答