2011-01-06 191 views
3

我有一個JList,它顯示了多個JPanels,我創建了一個自定義渲染器,返回一個新的JPanel。 JPanels顯示在JList中,但它們不可訪問,我不能選擇它們,如果我有一個按鈕或文本區域,我不能按它。 我想嘗試如果這在JList中工作,因爲我想進一步分頁。我設法通過將面板添加到Jscroll窗格來實現它,但很想讓JList的工作。JList與自定義渲染器

感謝

回答

10

這是JList(和JTabel,JComboBox等)的正常行爲。

您的自定義渲染器返回的JPanel未添加到Swing層次結構中。 JList只使用其paint方法在正確的位置繪製渲染器。渲染器只是用作郵票,而您在JList中看到的內容不是組件的圖像,而是組件的圖像。

這是一種在屏幕上顯示很多組件的有效方式,不需要實際實例化組件的開銷。請注意,您的渲染器可以始終返回相同的實例(甚至更可取)。

有關更多詳細信息,請參閱Swing tutorial

如果您希望JList的條目具有真實組件的作用,您可以執行以下操作。首先,使用JTable而不是JList。帶有一列且沒有標題的JTableJList大致相同。爲什麼使用JTable?因爲JTable提供編輯。編輯器在JTable上註冊,就像Renderers一樣。當用戶點擊一個JTable的單元格時,通常會出現一個編輯器。編輯器疊加在渲染器上,這次它是一個真正的組件。如果渲染器和編輯器組件相同,則用戶感覺JTable的單元是真實的組件。

Swing tutorial有這種技術的例子。

+1

謝謝你..非常清晰,簡潔 – AhmadAssaf 2011-01-06 15:52:19

0

我不能選擇他們,如果我有一個按鈕或者在它的文本區域,我不能按它

渲染器只是一個組成部分的繪畫。它不是一個真正的組件,所以你不能點擊按鈕或在文本區域輸入文本。

你需要爲此使用真實的組件。因此,最好使用組件創建自定義面板,然後將該面板添加到已添加到滾動窗格的另一個面板。

+0

或使用JTable中只有一列,並創建自定義的渲染/編輯:) – willcodejavaforfood 2011-01-06 15:27:42

0

這裏是我的解決方案:

public class AccountRenderer extends DefaultListCellRenderer { 

private static final long serialVersionUID = 1L; 

@Override 
public Component getListCellRendererComponent(JList list, Object value, 
     int index, boolean isSelected, boolean cellHasFocus) { 
    JLabel renderer = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 
    if (value != null) { 
     Account entry = (Account) value; 
     renderer.setText(entry.getName()); 
    } 
    return renderer; 
} 

}