Swing 控制面板

客户端的分析主界面,一个独立于 Minecraft GUI 系统之外的 Swing 窗口。

基本信息

属性 值
主类 mcp.mobius.opis.swing.SwingUI,extends JFrame
窗口标题 Opis Control Panel(SwingUI.java:71)
默认窗口尺寸 893 × 455,位置 (100, 100)(SwingUI.java:73)
关闭行为 WindowConstants.DISPOSE_ON_CLOSE(SwingUI.java:72)
边距 EmptyBorder(5, 5, 5, 5)(SwingUI.java:75)
布局 顶层 JTabbedPane(SwingConstants.TOP),置于 BorderLayout.CENTER(SwingUI.java:79-81)
打开方式 仅 /opis 指令,无按键绑定
面板实例数 23(1 个顶层 + 22 个分组内)
分组数 5

功能

面板树

全部在 ProxyClient.init()(ProxyClient.java:60-113)中注册:

顶层页签

  • Summary — PanelSummary,全局概览,接收 NEXUS_DATA 与 7 个 VALUE_TIMING_* 汇总

分组 Tracking(registerSection("Tracking"))

页签 面板类 SelectedTab
Players PanelPlayers PLAYERS
Entities PanelAmountEntities AMOUNTENTS
Tile Entities PanelAmountTileEnts AMOUNTTES
Dimensions PanelDimensions DIMENSIONS
Forced Chunks PanelForceLoadsPerDim FORCELOADS

分组 Server timing

页签 面板类 SelectedTab
Tile Entities PanelTimingTileEnts TIMINGTILEENTS
Tile Entities [Type] PanelTimingTileEntsPerClass TIMINGTILEENTSPERCLASS
Entities PanelTimingEntities TIMINGENTITES
Entities [Type] PanelTimingEntitiesPerClass TIMINGENTITESPERCLASS
Handlers PanelTimingHandlers TIMINGHANDLERS
Chunks PanelTimingChunks TIMINGCHUNKS
Events PanelTimingEvents TIMINGEVENTS

分组 Client timing

页签 面板类 SelectedTab
[Render] TileEnts PanelRenderTileEnts RENDERTILEENTS
[Render] Entities PanelRenderEntities RENDERENTITIES
[Render] Handlers PanelRenderHandlers RENDERHANDLERS
Events PanelEventClient CLIENTEVENTS

分组 Network

页签 面板类 SelectedTab
Outbound PanelOutbound PACKETOUTBOUND
Inbound PanelInbound PACKETINBOUND
Outbound 250 PanelOutbound250 PACKETOUTBOUND250
Inbound 250 PanelInbound250 PACKETINBOUND250

分组 Debug

页签 面板类 SelectedTab
Orphan TileEnts PanelOrphanTileEntities ORPHANTES
Threads PanelThreads THREADS

页签显示名是硬编码英文字符串(如 "Tile Entities [Type]"),仓库内没有 .lang 文件(find src/main/resources -name '*.lang' 0 命中),因此界面不可本地化。

资源

资源 路径
字体 assets/opis/fonts/LiberationMono-{Regular,Bold,Italic,BoldItalic}.ttf
加载的字体实例 fontMC8 / fontMC12 / fontMC16 / fontMC18 / fontMC24(ProxyClient.java:52),只实际创建了 fontMC8
图标 assets/opis/textures/icon/chunk_timing.png、chunk_loaded.png(供 Navigator 按钮使用)

ProxyClient.init() 只创建 fontMC8 = Fonts.createFont(new ResourceLocation("opis", "fonts/LiberationMono-Bold.ttf"), 14, true)。另外 4 个 fontMC* 字段声明了但从未赋值。

关闭与重开

窗口关闭触发 windowClosed(SwingUI.java:92-95):置 modOpis.swingOpen = false,并向服务端发 COMMAND_UNREGISTER_SWING,服务端把该玩家移出 playersSwing(ServerMessageHandler.java:222-223),从而停止向其推送数据。

TabPanelRegistrar.stateChanged 在每次切页时上报 SWING_TAB_CHANGED,服务端记住 PlayerTracker.INSTANCE.playerTab,因此重开面板会回到上次所在页。

数值

数值名 值
顶层页签数 1
分组数 5
面板总数 23
SelectedTab 枚举成员数 27(其中 PACKETS 无对应面板)
Tooltip 初始延迟 500 ms(SwingUI.java:84)
Tooltip 消失延迟 60000 ms(SwingUI.java:85,写作 60 * 1000)
服务端下发的表格条数 100(getWorses(100) / getTopChunks(100))

交互

触发 行为
玩家执行 /opis 窗口置为可见
关闭窗口 停止接收数据推送
切换页签 立即上报服务端记忆
地图上双击区块 SwingUI.showTab(SelectedTab.TIMINGCHUNKS) 并选中对应行
地图上双击强制加载区块 SwingUI.showTab(SelectedTab.FORCELOADS)

后两条来自地图覆盖层的点击回调,见 navigator。

已知事实:Summary 页的一个空格永远不更新

PanelSummary 注册了 Message.VALUE_TIMING_ENTUPDATE 的 handler(ProxyClient.java:177)并在 PanelSummary.java:497 有对应分支,但服务端从不发送该消息(ServerMessageHandler.java:160 是空分支),全仓共 4 处引用均为接收侧。详见 network-protocol。

相关条目