如何在Minecraft Forge MDK 1.12.2中获取当前打开GUI的标题?
解决Minecraft 1.12.2 Forge模组获取当前GUI标题的方案
方案1:直接访问内置GUI的title字段
1.12.2中大部分官方GUI(比如GuiChest、GuiInventory、GuiOptions等)都自带public String title字段,可通过类型转换直接读取:
Minecraft mc = Minecraft.getMinecraft(); if (mc.currentScreen != null) { if (mc.currentScreen instanceof GuiChest) { String chestTitle = ((GuiChest) mc.currentScreen).title; // 处理标题逻辑 } else if (mc.currentScreen instanceof GuiOptions) { String optionsTitle = ((GuiOptions) mc.currentScreen).title; // 处理标题逻辑 } // 其他内置GUI类可依此类推 }
缺点:需针对每个GUI子类单独适配,无法通用所有场景。
方案2:反射读取GUI的标题变量
对于没有公开title字段的GUI(包括自定义GUI),可以通过反射提取其内部存储的标题字符串:
Minecraft mc = Minecraft.getMinecraft(); if (mc.currentScreen != null) { try { // 替换为目标GUI类中存储标题的字段名,比如自定义GUI可能叫"guiTitle" Field titleField = mc.currentScreen.getClass().getDeclaredField("title"); titleField.setAccessible(true); String guiTitle = (String) titleField.get(mc.currentScreen); // 处理标题逻辑 } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } }
如果是监听全局GUI渲染,可结合GuiScreenEvent.DrawScreenEvent.Post事件实现:
@SubscribeEvent public void onGuiDrawFinished(GuiScreenEvent.DrawScreenEvent.Post event) { GuiScreen screen = event.getGui(); try { Field titleField = screen.getClass().getDeclaredField("title"); titleField.setAccessible(true); String title = (String) titleField.get(screen); // 处理标题逻辑 } catch (Exception e) { // 字段不存在时的兜底处理 } }
注意:需确保类已通过@EventBusSubscriber注解注册到事件总线。
方案3:自定义GUI统一实现标题接口
如果是开发自己的GUI模块,可定义一个接口强制实现标题获取逻辑:
public interface IGuiWithTitle { String getGuiTitle(); }
让自定义GUI类实现该接口:
public class MyCustomGui extends GuiScreen implements IGuiWithTitle { private final String guiTitle = "我的自定义界面"; @Override public String getGuiTitle() { return guiTitle; } // GUI其他渲染逻辑 }
后续获取标题时直接判断类型即可:
if (mc.currentScreen instanceof IGuiWithTitle) { String title = ((IGuiWithTitle) mc.currentScreen).getGuiTitle(); }
补充说明
1.12.2的GuiScreen基类没有统一的标题获取方法,因为不同GUI的标题存储方式差异较大,需根据场景选择适配方案:处理官方GUI优先用方案1,自定义GUI推荐方案3,未知GUI可尝试方案2的反射兜底。
内容的提问来源于stack exchange,提问作者Interdum01
相关产品推荐
相关产品推荐

