You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 20:27:04