Java Swing - JList自定义单元格渲染 - 捕获操作

Eva*_*ark 6 java swing jlist cellrenderer

每当我为JList创建自定义单元格渲染器时,我添加到它的任何元素都不会响应操作.例如,如果我让单元格渲染器返回一个带有元素的JPanel,其中一个具有ActionListener,则它根本不响应.

为什么是这样?

Pet*_*ser 11

渲染器可能看起来像是返回单元组件的工厂,但实际上它遵循flyweight渲染方法并使用相同的组件来渲染所有单元格(每次调用getListCellRendererComponent()都应该为特定单元格重新配置相同的组件实例,返回它以便可以渲染单元格).

这样,您可以JList(以及JTableJTree)显示大量的单元格,而无需为每个单元格实例化组件.作为副作用,渲染组件无法响应事件,因为它仅在渲染循环期间使用,但不会出现在组件树中.

正如Neil Coffey所说,您可以将侦听器添加到JList(JTable,JTree),并使用辅助方法(locationToIndex(...),getCellBounds(...))来调度受影响的单元格,从而处理特定于单元格的逻辑.


Nei*_*fey 6

作为列表单元格渲染器返回的项目仅用于:渲染.使用JList注册侦听器(通常,您需要ListSelectionListener).