【问题标题】:Java Swing - JList custom cell rendering - capturing actionsJava Swing - JList 自定义单元格渲染 - 捕获动作
【发布时间】:2010-10-19 01:58:14
【问题描述】:

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

这是为什么?

【问题讨论】:

  • 非常好的问题。我认为这可能与 ItemListeners 有关,但现在我不这么认为了...我尝试查找示例代码但没有成功。
  • 您好,我也遇到了同样的问题,请问您能解决问题吗?

标签: java swing jlist cellrenderer


【解决方案1】:

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

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

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

【讨论】:

  • 把渲染的组件想象成橡皮图章。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 2017-10-25
    • 2021-02-15
    • 2013-09-04
    • 1970-01-01
    相关资源
    最近更新 更多