如何在JDA中使用setComponents()方法添加超过5个自定义按钮?
解决JDA中按钮数量超5个时的交互消息组件设置问题
核心原理
Discord规定每个ActionRow(按钮行)最多容纳5个按钮,当按钮数量超过5个时,需要将按钮拆分到多个ActionRow中。另外,Button本身就是LayoutComponent的子类,无需额外转换,直接将Button包装进ActionRow即可满足setComponents()的参数要求。
实现代码示例
List<Button> buttons = new ArrayList<>(); // 填充按钮逻辑,比如: // buttons.add(Button.primary("btn1", "按钮1")); // buttons.add(Button.secondary("btn2", "按钮2")); // ... 直到按钮数量超过5个 // 方式1:循环分组封装ActionRow List<LayoutComponent> components = new ArrayList<>(); for (int i = 0; i < buttons.size(); i += 5) { int endIndex = Math.min(i + 5, buttons.size()); List<Button> rowButtons = buttons.subList(i, endIndex); components.add(ActionRow.of(rowButtons)); } // 方式2:用Stream流式分组 List<LayoutComponent> streamComponents = IntStream.range(0, (buttons.size() + 4) / 5) .mapToObj(i -> buttons.subList(i * 5, Math.min((i + 1) * 5, buttons.size()))) .map(ActionRow::of) .collect(Collectors.toList()); // 更新消息组件,二选一传入分组后的组件集合即可 event.getHook().editOriginalEmbeds(eb.build()) .setComponents(components) .queue();
关键说明
ActionRow.of(buttons)会将传入的按钮列表封装为一行组件,每个ActionRow最多接受5个按钮,超过数量会抛出异常,因此必须提前按5个一组拆分Button实现了LayoutComponent接口,ActionRow同样是LayoutComponent的实现类,因此分组后的ActionRow集合可以直接传入setComponents()setComponents()支持传入单个LayoutComponent、多个LayoutComponent参数,或者一个Collection<LayoutComponent>,适配多种传入方式
内容的提问来源于stack exchange,提问作者EntchenEric
相关产品推荐
相关产品推荐

