Java Swing – настраиваемый рендеринг ячеек JList – захват действий

StackOverflow https://stackoverflow.com/questions/742958

Вопрос

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

Почему это?

Это было полезно?

Решение

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top