2009-04-13 2 views
6

Каждый раз, когда я создаю собственный визуализатор ячеек для JList, любые элементы, которые я добавляю к нему, никогда не реагируют на действия. Например, если у меня есть средство отображения ячеек, возвращаю JPanel с элементами на нем, один из которых имеет ActionListener, он не отвечает вообще.Java Swing - JList для создания пользовательских ячеек - операции захвата

Почему это?

+1

Очень хороший вопрос. Я думал, что это может иметь какое-то отношение к ItemListeners, но теперь я так не думаю ... Я пробовал найти образец кода, но не был успешным. – Uri

+0

Привет, я сталкиваюсь с той же проблемой, могу ли вы решить проблему? – user236501

ответ

6

Элемент, который вы возвращаете как средство отображения списка ячеек, предназначен для этого: рендеринг. Зарегистрируйте слушателей с помощью JList (обычно вам нужен ListSelectionListener).

11

Отображатель может выглядеть как фабрика для возвращения компонентов для клеток, но на самом деле это следует за мухи рендерингом подхода и использует же компонента для визуализации всех ячеек (каждый вызов getListCellRendererComponent() должен перенастроить тот же экземпляр компонента для конкретной ячейки и возвращает его, чтобы можно было отобразить ячейку).

Таким образом, вы можете иметь JList (а также) и отображать огромное количество ячеек без необходимости создавать компоненты для каждой ячейки. В качестве побочного эффекта компонент визуализации не может реагировать на события, поскольку он используется только в цикле рендеринга, но не отображается в дереве компонентов.

Подобно тому, как сказал Нил Коффи, вы можете добавить слушателей к JList (JTable, JTree) вместо этого, и использовать вспомогательные методы (locationToIndex(...), getCellBounds(...)) для отправки которых клетка была затронута и, таким образом, иметь дело с клеточной специфической логикой.

+1

+1 для достойного объяснения – basszero

+1

Подумайте о компоненте в виде резиновой штампа. –