Если вы не хотите, чтобы выполнялась штамповка резины, вам придется создать собственную реализацию JList, использующую фактические компоненты.
Вы можете попытаться обойти эффект штамповки штампов, кэшируя каждый компонентдля каждой строки в вашем рендерере и привязать к нему значения и вернуть тот экземпляр, когда JList запрашивает у него рендерер.Это довольно рискованно, потому что если у вас отображается 20 строк, вам придется кэшировать 20 экземпляров в вашем рендерере, и вы можете использовать один из них только тогда, когда строка не видна.Это означало бы, что если бы у вас было 5 уникальных конфигураций (A, B, C, D, E) компонентов, у вас могло бы быть 10 типа A, 5 типа B, 2 типа C и 3 типа D и 0 типаE отображается.Однако вы не можете просто повторно использовать один из этих компонентов, не зная, отображается ли он или нет.Таким образом, вы должны принять во внимание, отображается ли строка и подходит ли она для строки, которую вы отображаете.И вам нужно будет очистить после того, как строка будет скрыта.
Другой вариант - создать отдельный компонент для строки, который инкапсулирует все ваши варианты X, и поместить их в CardLayout.Затем вы можете просто кэшировать по одному на каждую отображаемую строку и просто менять отображаемую карту при рендеринге этой строки.Я думаю, что это может быть самым простым вариантом для вас.
Более сложная часть будет состоять в том, чтобы перенаправлять события, щелчки мыши, события клавиатуры и т. Д. На эти активные компоненты, чтобы они реагировали как обычные компоненты.Повторная визуализация кнопок, когда пользователь нажимает на них, и так далее, будет сложной задачей.Не невозможно, но утомительно.
Наконец, переменная высота строки JList - это боль.Особенно в ваших вычислениях, чтобы выяснить, отображается строка или нет, потому что вы не можете просто выполнить простую математику, например: int rowHeight = jlist.getHeight / model.size ().Не работаетВы должны рассчитать высоту каждой строки и их высоту, чтобы выяснить, видима строка или нет.
Выполнение того, о чем вы говорите, - это большая работа и очень сложное кодирование, чтобы обойти некоторые изпредположения JList, чтобы заставить его работать.В конце концов, вам может быть проще реализовать собственный элемент управления List, который принимает различные дизайнерские решения.В любом случае для того, чтобы заставить его работать, вам потребуется хорошо разбираться в Swing.