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。
相关条目
- /opis - 打开本窗口的唯一入口
- extension-api -
ITabPanel/TabPanelRegistrar的接口定义 - network-protocol - 面板消费的 69 种消息
- navigator - 地图覆盖层与面板的联动
- profiler-sections - 各页签数据的采集来源