Java 为什么我的JTable CellRenderer一直在运行?
//新手问题 我有一个JTable,它几乎是基本的单元渲染器(线的颜色不同)。 我注意到我的单元格渲染器一直在为屏幕上显示的行运行,即使我没有对表格执行任何操作 应该是这样的吗?它不应该渲染每个单元格一次吗,就这样? 我如何让它停止,并且只重新计算更改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
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));