每当我为JList创建自定义单元格渲染器时,我添加到其中的任何元素都不会响应操作。例如,如果我让单元格渲染器返回一个带有元素的JPanel,其中一个具有ActionListener,则它根本不响应。
为什么会这样?
答案 0 :(得分:11)
渲染器可能看起来像是返回单元格组件的工厂,但实际上它遵循 flyweight呈现方法并使用相同的组件渲染所有单元格(每次调用getListCellRendererComponent()
都应该重新配置特定单元格的相同组件实例并返回它以便可以渲染单元格。
这样,您可以JList
(以及JTable
和JTree
)显示大量单元格,而无需为每个单元格实例化组件。作为副作用,渲染组件无法响应事件,因为它仅在渲染循环期间使用,但不会出现在组件树中。
正如Neil Coffey所说,您可以将听众添加到JList
(JTable
,JTree
),然后使用辅助方法(locationToIndex(...)
,{{ 1}})调度哪个单元受到影响,从而处理特定于单元的逻辑。
答案 1 :(得分:6)
作为列表单元格渲染器返回的项目仅用于:渲染。使用JList注册侦听器(通常,您需要ListSelectionListener)。