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。

相关条目