我有一个表单,其中有两个List组件 - 第一个用作菜单,它在app启动时填充(List中的每个项目都是BlankContainer,Label和Button设置为Renderer)第二个根据用户从菜单中选择。所以我认为可以在我的菜单中将一个动作连接到Button,所以我为它添加了新的Action Event,但问题是从不调用action方法(onMenuItem_LinkButtonAction
)。我做了一些调试,原因是rootContainerName
方法中的handleComponentAction
变量始终是父Form的名称,而不是BlankContainer的名称。
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;
}
}
那么有一种方法可以捕获这样的事件并获取有关触发事件的Button的信息吗?
答案 0 :(得分:1)
由于按钮是无状态的(渲染器用作橡皮图章),因此它不会那样工作。诀窍是听取List上执行的操作然后尝试检测按钮是否被按下。
如果您使用GenericListCellRenderer
(通过GUI构建器创建的所有渲染器都使用它),您只需将渲染器实例强制转换为GenericListCellRenderer
,然后调用extractLastClickedComponent()
并假设返回的按钮不是' t null检查它是否与链接按钮匹配。
如果不是,则需要将动作侦听器绑定到链接按钮并切换标志(按下链接),然后在列表的动作侦听器中设置该标志以将其切换回来并执行适当的逻辑。原因是你获得了无状态的按钮事件,列表事件是重要的部分。
请参阅http://www.codenameone.com/3/post/2013/12/deeper-in-the-renderer.html