Java Swing - пользовательский рендеринг ячейки JList - захват действий - PullRequest
6 голосов
/ 13 апреля 2009

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

Почему это?

Ответы [ 2 ]

11 голосов
/ 14 апреля 2009

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

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

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

6 голосов
/ 13 апреля 2009

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

...