打开链接(openLink)

基本信息

属性 值
type 值 openLink(equals,大小写敏感)
实现类 lumien.custommainmenu.lib.actions.ActionOpenLink
参数 link(URL 字符串)
分发点 GuiConfig.getWantedAction(GuiConfig.java:391-393)

⚠️ 8 个动作里只有 openLink 用 equals 而非 equalsIgnoreCase(GuiConfig.java:391),其余 7 个都是大小写不敏感。写成 openlink 会匹配失败,getWantedAction 一路 return null(:419),按钮静默失效。

核心差异

本 mod 唯一会离开 Minecraft 进程的动作(通过 java.awt.Desktop)。openFolder 也会调 Desktop,但打开的是本地目录且没有二次确认。

二次确认流程

perform 并不直接开浏览器,而是先弹出自建的确认框(ActionOpenLink.java:17-20):

ActionOpenLink.perform
  → displayGuiScreen(new GuiCustomConfirmOpenLink(menu, link, -1, false))
  → menu.beingChecked = source      // 记住是哪个按钮/文本点的
        ↓ 用户选择
GuiCustomConfirmOpenLink.actionPerformed
  → id == 2 时复制链接到剪贴板
  → parentScreen.confirmClicked(id == 0, ...)  // 只有"确定"为 true
        ↓
GuiCustom.confirmClicked
  → 从 beingChecked 取出 ActionOpenLink.getLink()
  → 反射 java.awt.Desktop.getDesktop().browse(new URI(link))
  → 失败只 log "Couldn't open link"
  → displayGuiScreen(this)   // 回到原界面

三按钮确认框

GuiCustomConfirmOpenLink.initGui 把原版 GuiYesNo 的两个按钮删掉重加成三个(GuiCustomConfirmOpenLink.java:31-41):

ID 位置 行为
0 左 确认打开
2 中 复制链接到剪贴板
1 右 取消

并额外在 y=110 用 16764108(0xFFDD44)画一行 chat.link.warning 文字。showSecurityWarning 可由 disableSecurityWarning() 关掉,但本 mod 内部没有任何调用点。

链接可来自文本元素

GuiCustom.confirmClicked 同时接受 Button 和 Text 两种来源(GuiCustom.java:148-156),因此 文本(Text) 也能挂 openLink。注意 Text.setLink(String)(Text.java:54-56)虽然存在,但全仓无调用点,实际只能靠配置里的 action 块。

使用场景

主菜单上的官网、赞助、模组页面、CurseForge 链接等。

相关条目