Java 从列表中的容器调用操作

Java 从列表中的容器调用操作,java,codenameone,Java,Codenameone,我有一个表单,其中有两个列表组件-第一个作为菜单,在应用程序启动时填充(列表中的每个项目都是一个空白容器,标签和按钮设置为渲染器),第二个根据用户从菜单中的选择填充。因此,我认为可以将一个操作连接到菜单中的按钮,因此我为它添加了新的操作事件,但问题是操作方法(onMenuItem\u LinkButtonAction)从未被调用。我做了一些调试,原因是handleComponentAction方法中的rootContainerName变量始终是父窗体的名称,而不是空白容器的名称 if(rootC

我有一个表单,其中有两个列表组件-第一个作为菜单,在应用程序启动时填充(列表中的每个项目都是一个空白容器,标签和按钮设置为渲染器),第二个根据用户从菜单中的选择填充。因此,我认为可以将一个操作连接到菜单中的按钮,因此我为它添加了新的操作事件,但问题是操作方法(
onMenuItem\u LinkButtonAction
)从未被调用。我做了一些调试,原因是
handleComponentAction
方法中的
rootContainerName
变量始终是父窗体的名称,而不是空白容器的名称

if(rootContainerName.equals("Main")) {
    // "Main" is form which contains both Lists
    if("linkButton".equals(c.getName())) {
        onMain_LinkButtonAction(c, event);
        return;
     }
 }
 if(rootContainerName.equals("MenuItem")) {
     //MenuItem is my BlankContainer, programm will never pass above condition
     if("linkButton".equals(c.getName())) {
         onMenuItem_LinkButtonAction(c, event);
         return;
     }
 }

那么,有没有一种方法可以捕获这样一个事件并获取关于触发事件的按钮的信息呢?

因为按钮是无状态的(渲染器被用作橡皮戳),所以它不会以这种方式工作。诀窍是倾听列表上执行的操作,然后尝试检测是否按下了按钮

如果使用
GenericListCellRenderer
(所有通过GUI构建器创建的渲染器都使用该渲染器),则只需将渲染器实例强制转换为
GenericListCellRenderer
,然后调用
extractLastClickedComponent()
,并假设返回的按钮不是null,检查它是否与链接按钮匹配

如果没有,则需要将动作侦听器绑定到链接按钮并切换标志(按下链接),然后在列表的动作侦听器中,如果设置了该标志,则将其切换回并执行适当的逻辑。原因是您得到的按钮事件是无状态的,列表事件才是重要的部分


参见

谢谢你的回答,谢伊,对不起,我没有注意到那篇文章,这让我更清楚了:)也许还有一个问题-我意识到我必须在列表中使用MultiButton组件,所以有没有办法从中捕获事件?因为文章提到,通过
extractLastClickedComponent
从复合组件中提取事件是不可能的。谢谢这是一个多列表。不幸的是,由于它是一个铅组件提取将不适用于这种情况下,即使它做了多按钮只有一个按钮,其他一切都是标签。