如何通过ControlsFX的ActionGroup将字符串列表填充到ContextMenu子菜单
你只需要提前将字符串列表批量转换为DummyAction实例集合,再统一传入单个ActionGroup的构造方法,或者添加到单个ActionGroup的条目列表中即可,具体实现如下:
方法1:构造ActionGroup时直接传入转换后的Action集合
先将字符串列表统一转换为DummyAction数组,再一次性传给ActionGroup:
public class HelloActionGroup{ Label label = new Label("hello world, I'm a label"); label.setContextMenu(ActionUtils.createContextMenu(action)); // 准备字符串列表 List<String> actionNameList = new ArrayList<>(); actionNameList.add("Action1"); actionNameList.add("Action2"); actionNameList.add("Action3"); // 把字符串批量转为DummyAction实例 DummyAction[] groupActions = actionNameList.stream() .map(DummyAction::new) .toArray(DummyAction[]::new); // 仅创建一个ActionGroup,传入转换好的所有Action private Collection<? extends Action> action = Arrays.asList( new ActionGroup("Group 1", groupActions) ); private static class DummyAction extends Action{ public DummyAction(String name){ super(name); } } }
方法2:先创建空ActionGroup,再循环添加条目
如果需要动态生成内容,可以先初始化空的ActionGroup,再循环把DummyAction添加到分组的条目列表中:
// 初始化空分组 ActionGroup group1 = new ActionGroup("Group 1"); List<String> actionNameList = new ArrayList<>(); actionNameList.add("string1"); actionNameList.add("string2"); // 循环添加到同一个分组里,不要每次循环新建分组 for (String str: actionNameList) { group1.getItems().add(new DummyAction(str)); } // 把组装好的分组加入外层Action集合 private Collection<? extends Action> action = Arrays.asList(group1);
你之前的问题是在循环内每次都新建了ActionGroup,所以每个字符串都对应了独立的分组,把所有DummyAction都添加到同一个ActionGroup的items列表中就能实现同一个分组下展示所有列表内容的效果。
内容的提问来源于stack exchange,提问作者FARS
相关产品推荐
相关产品推荐

