繁体   English   中英

单元格编辑器的实例数是多少?

[英]The number of instances of a cell editor?

阅读O'Reilly的一本旧的Java Swing书,它显示了下面列出的代码段。

该书还显示: 请注意,每次对getListCellRendererComponent()的调用都返回相同的实例。 这对性能非常重要。 每次调用该方法时创建一个新实例都会给系统带来不必要的负担。

我的理解(可能是错误的)是,除非将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;
}
}

不,每个单元格都没有自己的实例(您可以通过断点构造函数来验证此实例)。 这里没有任何魔法可言; 您是实例化渲染器的人,那么怎么会有X * Y实例?

如果您对为什么这样做感到困惑:返回的组件用于呈现单元格,但是可以自由用于下一次对getListCellRendererComponent调用。

文档

返回已配置为显示指定值的组件。 然后调用该组件的paint方法来“渲染”单元格。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM