Это нормальное поведение JList
(и JTabel
, JComboBox
и т. Д.).
JPanel
, который возвращает пользовательский рендерер, не добавляется в иерархию Swing. Только его paint
метод используется JList
, чтобы нарисовать средство визуализации в нужном месте. Средство визуализации просто выступает в качестве штампа, и в JList
вы видите не компоненты, а изображения компонентов.
Это эффективный способ отображения многих компонентов на экране, не требующий дополнительных реальных компонентов. Обратите внимание, что ваш рендерер может всегда возвращать один и тот же экземпляр (это даже предпочтительнее).
Подробнее см. Учебник Swing .
Если вы хотите, чтобы записи JList
действовали как реальные компоненты, вы можете сделать следующее. Сначала используйте JTable
вместо JList
. JTable
с одним столбцом и без заголовка примерно такой же, как JList
. Зачем использовать JTable
? Потому что JTable
предоставляет редакторы. Редакторы регистрируются на JTable
, как и Renderers. Редактор обычно появляется, когда пользователь щелкает ячейку JTable. Редактор накладывается на средство визуализации, и на этот раз это настоящий компонент. Если компоненты Renderer и Editor идентичны, то у пользователя возникает ощущение, что ячейки JTable являются реальными компонентами.
В учебнике Swing есть примеры этой техники.