Динамическая реализация JList - PullRequest
0 голосов
/ 21 декабря 2011

У меня есть список сущностей, где каждая сущность отображается в виджете на основе JPanel.Виджеты имеют динамическое поведение - после размещения на панели они могут быть изменены базовым объектом.Это происходит автоматически.Кроме того, некоторые виджеты могут быть изменены с помощью различных действий, например, при нажатии кнопки.

Вопрос в том, как организовать их в нечто вроде JList, но без техники резиновых штампов.Другими словами, я хочу JList, где каждый предмет, созданный с помощью cellrenderer, остается "живым".

Прямо сейчас я реализовал быстрый и грязный компонент на основе JPanel с вертикальным BoxLayout, он использует JList's компонент рендерера и его модель ... но моя реализация слишком грязная ...

Хм .. да, использование JTable тоже не подходит.

У вас есть идеи?

Ответы [ 3 ]

0 голосов
/ 22 декабря 2011

Хорошо.Я не нахожу никакой реализации такого компонента.Пусть это будет первым.https://github.com/wertlex/JActiveList

PS Я не думаю, что это правильный способ реализации ... но он работает.

0 голосов
/ 11 февраля 2014

используйте JList и ActionListener XD

0 голосов
/ 21 декабря 2011

Если вы не хотите, чтобы выполнялась штамповка резины, вам придется создать собственную реализацию 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.

...