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

Java 为什么我的JTable CellRenderer一直在运行?,java,swing,jtable,tablecellrenderer,Java,Swing,Jtable,Tablecellrenderer,//新手问题 我有一个JTable,它几乎是基本的单元渲染器(线的颜色不同)。 我注意到我的单元格渲染器一直在为屏幕上显示的行运行,即使我没有对表格执行任何操作 应该是这样的吗?它不应该渲染每个单元格一次吗,就这样? 我如何让它停止,并且只重新计算更改 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int ro

//新手问题

我有一个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;

  }

渲染器已缓存渲染组件,但未进行任何更改,也未重新渲染

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

因此,是的,这是JTable的正常行为。

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

如果您想要快速高效的JTables,那么Sun在这方面有权威文章:

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

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


在实现了那篇文章中提到的两到三种技术之后,您会注意到JTable呈现的速度有了惊人的提高,并且您会注意到生成的垃圾更少(因此GC需要更少地启动)。

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

继@Steve McLeod的提议之后,我开始构建一个带有相同错误的示例代码,直到那时我才意识到在我的一个CellRenderer中

@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;
    }
它不断地改变行线,而同一行中的其他渲染器也做同样的。。。
所以他们不断地互相开火

我是这么想的,但事实并非如此:当桌子在屏幕上,鼠标不动时,我仍然看到我的日志消息像madit一样运行是“正常的”,因为默认的JTable实现非常糟糕。我链接的这篇文章也解释了如何为频繁更新的JTables获得正常和快速的行为。当用户不使用鼠标或表格时,不断调用呈现程序是不正常的。你的程序中有一些代码一定是循环的。发布演示问题的SSCCE()。这是不正确的行为。您能否创建一个自包含的代码示例来演示这一点?这将帮助我们解决这个问题。@Steve我认为代码太多了。我刚刚发现我有另一个渲染器,用于表中的特定单元格。可能是他们互相开火吗?可能是任何原因。心理调试很难。只是一个主方法,它创建一个JFrame,添加一个表,设置一个单元格渲染器,就像您已经显示的一样,并且有相同的问题。请注意,当您的表被排序时,您将从模型中检索错误的
过滤器。作为参数传递的
在“表视图坐标”中,而不是在“模型坐标”中,为ChristmasTree页面添加了存档链接,因为原始链接已失效。它将在我的编辑被审查后出现。如果这是真的,JTable的性能真的非常糟糕,那么遵循文章中糟糕的(对于生产代码)绘制捷径的想法不会有太大的改变:它甚至没有提高一个数量级;-)
table.setRowHeight(row, Math.max(1, getPreferredSize().height));