Widget 基类与层级
基本信息
| 属性 | 值 |
|---|---|
| 包路径 | com.cleanroommc.modularui.widget |
| 文件数 | 13(含 scroll/ 5、sizer/ 12) |
| 顶层基类 | AbstractWidget implements IWidget(widget/AbstractWidget.java:22,abstract) |
| 通用基类 | Widget<W extends Widget<W>> extends AbstractWidget(widget/Widget.java:47) |
| 行数 | Widget.java 约 830 行,AbstractParentWidget / ParentWidget 各数百行 |
功能
继承层级
IWidget (api/widget/IWidget.java:35)
├── EmptyWidget (widget/EmptyWidget.java:15) implements IWidget(无绘制)
│ └── VoidWidget (widgets/VoidWidget.java:5)
└── AbstractWidget (widget/AbstractWidget.java:22) abstract, implements IWidget
├── Widget<W> (widget/Widget.java:47) implements IPositioned, ITooltip, ISynced
│ ├── AbstractParentWidget<I,W> (widget/AbstractParentWidget.java:21)
│ │ ├── ParentWidget<W> (widget/ParentWidget.java:11) implements IParentWidget
│ │ │ └── Flow (widgets/layout/Flow.java:20) implements ILayoutWidget
│ │ │ ├── Row (widgets/layout/Row.java:9)
│ │ │ └── Column (widgets/layout/Column.java:9)
│ │ └── AbstractScrollWidget<I,W> (widget/AbstractScrollWidget.java:29) abstract
│ │ implements IViewport, Interactable
│ │ → ScrollWidget / Grid / ListWidget / BaseTextFieldWidget
│ ├── SingleChildWidget<W> (widget/SingleChildWidget.java:10)
│ │ └── AbstractCycleButtonWidget<W> (widgets/AbstractCycleButtonWidget.java:27)
│ │ implements Interactable
│ ├── DraggableWidget<W> (widget/DraggableWidget.java:16) implements IDraggable, IViewport
│ ├── DragHandle (widget/DragHandle.java) implements IDraggable, IViewport
│ └── IDrawable.DrawableWidget (api/drawable/IDrawable.java:179)
└── DelegatingWidget (widget/DelegatingWidget.java:14) implements IDelegatingWidget
要点:AbstractScrollWidget 继承 AbstractParentWidget(不是 Widget),
EmptyWidget 则不继承 AbstractWidget 而是直接 implements IWidget。
widgets/TransformWidget.java 也继承 DelegatingWidget,用于给子控件套一层坐标变换。
Widget 的构建器方法(按用途分组)
Widget.java 共 62 处 public 成员(grep -c 'public '),构建器方法都是**返回 W(自身类型)**的链式调用:
| 分组 | 方法(行) |
|---|---|
| 背景与覆盖层 | background(IDrawable...)(:431)、overlay(:441)、shadow(:403)、hoverBackground(:479)、hoverOverlay(:498)、backgroundOverlay(:420)、hoverBackgroundOverlay(:468) |
| 主题开关 | disableThemeBackground(:503)、disableHoverThemeBackground(:508)、disableHoverBackground(:518)、disableHoverOverlay(:527)、widgetTheme(String)(:537)、widgetTheme(WidgetThemeKey<?>)(:551) |
| 提示气泡 | tooltip()(:319)、tooltip(RichTooltip)(:333)、markTooltipDirty()(:342) |
| 更新回调 | onUpdateListener(Consumer<W>)(:615)、onUpdateListener(Consumer<W>, boolean merge)(:626)、listenGuiAction(IGuiAction)(:598) |
| 启用条件 | setEnabledIf(Predicate<W>)(:648) |
| 坐标变换 | transform(BiConsumer<W,IViewportStack>)(:674) |
| 可见性 | invisible()(:556) |
| 名称 | name(String)(:817)、debugName(String)(:807,@Deprecated) |
| 配方查看器 | excludeAreaInRecipeViewer()(:790)/ (boolean)(:794)、isExcludeAreaInRecipeViewer()(:786) |
绘制回调
Widget 提供 4 个绘制阶段,派生类按需覆写:
| 方法 | 行 | 阶段 |
|---|---|---|
drawBackground(ModularGuiContext, WidgetThemeEntry<?>) |
:151 |
最底层背景 |
draw(ModularGuiContext, WidgetThemeEntry<?>) |
:177 |
空实现,供派生类画主内容 |
drawOverlay(ModularGuiContext, WidgetThemeEntry<?>) |
:189 |
覆盖层(物品堆叠数等) |
drawForeground(ModularGuiContext) |
:203 |
最顶层前景 |
交互
| 阶段 | 触发 |
|---|---|
initialiseSyncHandler(ModularSyncManager, boolean late) |
:103 界面打开时 |
onUpdate() |
:572 每次界面刷新 |
dispose() |
:123 界面关闭时 |
Widget.java:42-43的类注释明确警告:界面关闭后不应再持有 widget 引用; 界面打开期间可以随意移除并重复添加同一个 widget。