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