我有一個JList,它顯示了多個JPanels,我創建了一個自定義渲染器,返回一個新的JPanel。 JPanels顯示在JList中,但它們不可訪問,我不能選擇它們,如果我有一個按鈕或文本區域,我不能按它。 我想嘗試如果這在JList中工作,因爲我想進一步分頁。我設法通過將面板添加到Jscroll窗格來實現它,但很想讓JList的工作。JList與自定義渲染器
感謝
我有一個JList,它顯示了多個JPanels,我創建了一個自定義渲染器,返回一個新的JPanel。 JPanels顯示在JList中,但它們不可訪問,我不能選擇它們,如果我有一個按鈕或文本區域,我不能按它。 我想嘗試如果這在JList中工作,因爲我想進一步分頁。我設法通過將面板添加到Jscroll窗格來實現它,但很想讓JList的工作。JList與自定義渲染器
感謝
這是JList
(和JTabel
,JComboBox
等)的正常行爲。
您的自定義渲染器返回的JPanel
未添加到Swing層次結構中。 JList
只使用其paint
方法在正確的位置繪製渲染器。渲染器只是用作郵票,而您在JList
中看到的內容不是組件的圖像,而是組件的圖像。
這是一種在屏幕上顯示很多組件的有效方式,不需要實際實例化組件的開銷。請注意,您的渲染器可以始終返回相同的實例(甚至更可取)。
有關更多詳細信息,請參閱Swing tutorial。
如果您希望JList
的條目具有真實組件的作用,您可以執行以下操作。首先,使用JTable
而不是JList
。帶有一列且沒有標題的JTable
與JList
大致相同。爲什麼使用JTable
?因爲JTable
提供編輯。編輯器在JTable
上註冊,就像Renderers一樣。當用戶點擊一個JTable的單元格時,通常會出現一個編輯器。編輯器疊加在渲染器上,這次它是一個真正的組件。如果渲染器和編輯器組件相同,則用戶感覺JTable的單元是真實的組件。
Swing tutorial有這種技術的例子。
我不能選擇他們,如果我有一個按鈕或者在它的文本區域,我不能按它
渲染器只是一個組成部分的繪畫。它不是一個真正的組件,所以你不能點擊按鈕或在文本區域輸入文本。
你需要爲此使用真實的組件。因此,最好使用組件創建自定義面板,然後將該面板添加到已添加到滾動窗格的另一個面板。
或使用JTable中只有一列,並創建自定義的渲染/編輯:) – willcodejavaforfood 2011-01-06 15:27:42
這裏是我的解決方案:
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;
}
}
謝謝你..非常清晰,簡潔 – AhmadAssaf 2011-01-06 15:52:19