阅读O'Reilly的旧Java Swing书,它显示了下面列出的代码片段。
这本书还写道: 请注意,每次调用getListCellRendererComponent()都会返回相同的实例。这对性能非常重要。每次调用方法时创建一个新实例都会给系统带来不必要的压力。
我的理解(可能是错误的)是每个单元格都有自己的Cell Renderer实现,除非BookCellRenderer类被定义为 static 。
每个单元格是否都有自己的Cell Renderer实例? 该类是否应该是静态的以确保只有一个实例? 这个只生成一个实例的特定类是什么?
// BookCellRenderer.java
// A custom cell renderer for BookEntry objects.
//
import javax.swing.*;
import java.awt.*;
public class BookCellRenderer extends JLabel implements ListCellRenderer {
private static final Color HIGHLIGHT_COLOR = new Color(0, 0, 128);
public BookCellRenderer() {
setOpaque(true);
setIconTextGap(12);
}
public Component getListCellRendererComponent(
JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus)
{
BookEntry entry = (BookEntry)value;
setText(entry.getTitle());
setIcon(entry.getImage());
if(isSelected) {
setBackground(HIGHLIGHT_COLOR);
setForeground(Color.white);
} else {
setBackground(Color.white);
setForeground(Color.black);
}
return this;
}
}
答案 0 :(得分:0)
不,每个单元格都没有自己的实例(您只需通过破坏构造函数来验证这一点)。这里没有什么神奇之处;你是实例化渲染器的人,那么怎么会有X * Y实例?
如果您对此安全的原因感到困惑:返回的组件用于呈现单元格,但下次调用getListCellRendererComponent
时可以自由使用。
来自docs:
返回已配置为显示指定值的组件。然后将该组件的绘制方法调用到"渲染"细胞。
换句话说,该组件仅用于执行paint
,然后不再使用。这就是为什么使用单件组件是安全的(即每次都返回相同的组件)。
无需定义单例/静态渲染器。