Я нашел решение, которое составляет не менее 90%:)
1. Мой рендер не расширяет ListCellRenderer, но ListCellRenderer<SomeClass>
.Таким образом, подпись соответствующего метода public Component getListCellRendererComponent(JList list, SomeClass value, int index, boolean isSelected, boolean cellHasFocus)
.Видите ли, значение не является объектом.2. Нет необходимости для этого метода возвращать JLabel.Это может быть любой компонент.Поэтому я установил вертикальную коробку с JLabel в качестве первого содержимого и JSeparator в качестве второго.Поэтому нет необходимости иметь JSeparator в качестве каждого второго элемента в списке.В списке отображаются только объекты данных.
Это приводит к еще одной проблеме: размер JLabel в этом боксе уменьшен до минимума.Нелегко расширить его на всю ширину.Чтобы установить ширину JLabel на полную ширину в блоке, вы должны установить MaximumSize .Чтобы получить правильный размер, я использую размер JLabel, сохраняю высоту и ширину JSeparator, и устанавливаю максимальный размер JLabel в это значение.Проблема здесь: При запуске JSeparator не имеет полезного размера (0/0).Так что я жду с настройкой, пока не получу полезный размер здесь.
И вот недостающие 10%: после запуска первая ячейка списка не корректируется по размеру.Он по-прежнему отображает JLabel с минимальным размером.Это исправляется после первого обновления данных или при смене отображаемой страницы один раз и обратно.В настоящее время я не уверен, как это исправить.может быть искусственно запустить событие изменения после того, как список виден?
Добавление: я обновил первый элемент после того, как isValid()
вернул true.isVisible()
здесь нехорошо.