单元格编辑器的实例数量?

时间:2015-07-19 14:50:04

标签: java instance render

阅读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;
}
}

1 个答案:

答案 0 :(得分:0)

不,每个单元格都没有自己的实例(您只需通过破坏构造函数来验证这一点)。这里没有什么神奇之处;你是实例化渲染器的人,那么怎么会有X * Y实例?

如果您对此安全的原因感到困惑:返回的组件用于呈现单元格,但下次调用getListCellRendererComponent时可以自由使用。

来自docs

  

返回已配置为显示指定值的组件。然后将该组件的绘制方法调用到"渲染"细胞。

换句话说,该组件仅用于执行paint,然后不再使用。这就是为什么使用单件组件是安全的(即每次都返回相同的组件)。

无需定义单例/静态渲染器。