LogoArcartX Doc

UIHandler:UI处理器

UI处理器抽象类

UIHandler

  • UIHandler 是一个抽象类,提供了更优雅的UI管理方式。
  • 它封装了UI的注册、生命周期回调和数据通信,你只需要继承它并实现回调方法即可。
  • 创建继承实现之后,创建实例即注册UI

基本用法

public class MyUI extends UIHandler {
 
    private final JavaPlugin plugin;
 
    public MyUI(JavaPlugin plugin) {
        super("my_ui_id", new File(plugin.getDataFolder(), "ui/my_ui.yml"));
        this.plugin = plugin;
    }
 
    @Override
    public JavaPlugin getPlugin() {
        return plugin;
    }
 
    @Override
    public void onOpenPre(Player player) {
        // UI打开前执行(服务端侧)
    }
 
    @Override
    public void onOpenPost(Player player) {
        // UI打开后执行(客户端确认打开后回调)
    }
 
    @Override
    public void onClose(Player player) {
        // UI关闭时执行
    }
 
    @Override
    public void onPacket(Player player, String identifier, List<String> data) {
        // 收到客户端UI发来的数据包时执行
    }
}

构造参数

  • identifier: String — UI唯一标识(构造后作为公开只读属性 identifier 可访问)
  • uiConfig: File — UI配置文件(私有构造参数)

构造时会自动调用 ArcartXUIRegistry.register() 注册UI,并绑定 OPENCLOSEPACKET 三类回调(对应 CallBackType 枚举)。

公开成员

identifier

  • 该UI的唯一标识(只读)。
  • 类型String

plugin(抽象)

  • 归属插件,子类必须实现(Java 中重写 getPlugin())。
  • 类型JavaPlugin

ui

  • 构造时注册得到的底层 ArcartXUI 对象,可直接用于 open/close/sendPacket/run/registerCallBack 等操作。
  • 类型ArcartXUI
  • 调用示例
myUI.getUi().sendPacket(player, "update", dataMap);

生命周期回调

onOpenPre(player)

  • UI打开前的回调,请求客户端打开UI之前执行,可在此处理数据或者发送早于控件create事件的预先包
  • 详细解释下这个控件create之前的包是什么意思:
    • UI打开流程:
      • 收到打开请求
      • 创建UI实例
      • 检查有没有在UI打开之前就给该UI发送的包 如果有则调用对应处理器处理
      • 创建该UI所有控件(即上文说的控件create)
  • 参数player: Player — 目标玩家
  • 适合在此处准备数据,发送控件create之前的包

onOpenPost(player)

  • UI打开后的回调,客户端确认UI已打开后触发
  • 参数player: Player — 目标玩家
  • 适合在此处发送初始数据到UI

onClose(player)

  • UI关闭时的回调
  • 参数player: Player — 目标玩家
  • 适合在此处清理资源、保存数据等

onPacket(player, identifier, data)

  • 收到客户端UI发来的数据包时触发
  • 参数
    • player: Player — 发送数据的玩家
    • identifier: String — 数据包标识
    • data: List<String> — 数据内容

便捷方法

open(player)

  • 为玩家打开此UI,会先调用 onOpenPre
  • 参数player: Player — 目标玩家
  • 调用示例
myUI.open(player);

close(player)

  • 为玩家关闭此UI
  • 参数player: Player — 目标玩家
  • 调用示例
myUI.close(player);

sendPacket(player, packetHandler, packet)

  • 向玩家客户端的UI发送数据包
  • 参数
    • player: Player — 目标玩家
    • packetHandler: String — 处理器名称
    • packet: Object — 数据包内容
  • 调用示例
myUI.sendPacket(player, "update", dataMap);

sendRun(player, ariaCode)

  • 在玩家客户端的UI中执行Aria脚本
  • 参数
    • player: Player — 目标玩家
    • ariaCode: String — Aria脚本代码
  • 调用示例
myUI.sendRun(player, "refreshList()");

ArcartXUI 接口

  • ArcartXUI 是UI对象的底层接口,UIHandler.uiArcartXUIRegistry.register() 返回的都是它的实例。
  • 提供了直接的打开、关闭、发包、执行脚本以及注册回调的能力。

属性

  • callbacks: MutableMap<CallBackType, MutableList<UICallBack>> — 各类回调列表,键为回调类型
  • id: String — UI唯一标识(可读写)

CallBackType 枚举PACKETOPENCLOSE — 分别对应收到数据包、UI打开、UI关闭三类事件。

registerCallBack(type, callBack)

  • 为指定类型注册一个UI回调。
  • 参数
    • type: CallBackType — 回调类型(PACKET / OPEN / CLOSE
    • callBack: UICallBack — 回调,函数式接口,形如 void call(CallData event)CallDataplayer(Player)、identifier(String)、data(List<String>)
  • 返回值:无
  • 调用示例
ui.registerCallBack(CallBackType.PACKET, event -> {
    Player player = event.getPlayer();
    String identifier = event.getIdentifier();
    List<String> data = event.getData();
});

open(player)

  • 为玩家打开此UI(直接发送打开包)。
  • 参数player: Player — 目标玩家
  • 返回值:无

open(player, callBack)

  • 为玩家打开此UI,并注册一个打开回调。
  • 参数
    • player: Player — 目标玩家
    • callBack: CallBack — 打开回调,函数式接口 void call()
  • 返回值:无

close(player)

  • 为玩家关闭此UI。
  • 参数player: Player — 目标玩家
  • 返回值:无

sendPacket(player, handlerName, packet)

  • 向玩家客户端的UI发送数据包。
  • 参数
    • player: Player — 目标玩家
    • handlerName: String — 处理器名称
    • packet: Object — 数据包内容
  • 返回值:无

run(player, code)

  • 在玩家客户端的UI中执行Aria脚本。
  • 参数
    • player: Player — 目标玩家
    • code: String — Aria脚本代码
  • 返回值:无