[英]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.