2009-04-13 78 views
6

任何时候我为JList创建自定义单元格渲染器时,我添加到它的任何元素都不会对动作做出响应。例如,如果我有单元格渲染器返回一个带有元素的JPanel,其中一个具有ActionListener,它根本没有响应。Java Swing - JList自定义单元格渲染 - 捕获动作

这是为什么?

+1

非常好的问题。我认为这可能与ItemListeners有关,但现在我不这么认为......我试图找到示例代码,但没有成功。 – Uri 2009-04-13 03:57:04

+0

嗨,我面临同样的问题,你能解决问题吗? – user236501 2010-07-16 03:17:23

回答

6

您作为列表单元格渲染器返回的项目专门用于:呈现。使用JList注册监听器(通常,您需要ListSelectionListener)。

11

渲染可能看起来像一个工厂返回组件的电池,但实际上它沿用了轻量级渲染方法和使用相同组件,用于渲染的所有单元格(每次调用getListCellRendererComponent()应该重新配置特定单元格的相同组件实例并返回它以便可以呈现单元格)。

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

正如尼尔·科菲说,你可以添加你的听众到JListJTableJTree)来代替,然后使用辅助方法(locationToIndex(...)getCellBounds(...))分配给哪个小区受到影响,因此处理单元特定的逻辑。