6

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

为什么是这样?

4

2 回答 2

11

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

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

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

于 2009-04-14T08:02:44.180 回答
6

您作为列表单元格渲染器返回的项目正是为此而设计的:渲染。使用 JList 注册侦听器(通常,您需要一个 ListSelectionListener)。

于 2009-04-13T04:42:23.703 回答