簡體   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