布局容器(Flow / Row / Column / Grid)

基本信息

属性 值
包路径 com.cleanroommc.modularui.widgets.layout
文件数 6
布局标记接口 ILayoutWidget(api/layout/ILayoutWidget.java)
展开接口 IExpander(widgets/layout/IExpander.java)

功能

类层次

类 文件:行 继承 说明
Flow widgets/layout/Flow.java:20 ParentWidget<Flow> implements ILayoutWidget 通用流式布局,可横可纵
Row widgets/layout/Row.java:9 Flow 横向流,语义化快捷方式
Column widgets/layout/Column.java:9 Flow 纵向流
Grid widgets/layout/Grid.java:31 AbstractScrollWidget<IWidget, Grid> implements ILayoutWidget, IParentWidget 网格布局,自带滚动
SimpleFlow widgets/layout/SimpleFlow.java:15 — 「一排同构元素」的轻量描述,供 Flow 内部排版用
IExpander widgets/layout/IExpander.java 接口 元素如何占据多余空间

Row 与 Column 都只是 Flow 的子类,没有独立逻辑——它们存在的意义是让调用方少写一个参数。

Flow 的三个静态快捷方式

Flow 提供 3 个静态工厂(Flow.java:22、:26、:30):

方法 行 说明
Flow.row() :22 横向
Flow.column() :26 纵向
Flow.col() :30 column() 的缩写

另有静态工具 Flow.layoutCrossAxisListLike(IWidget, List<SimpleFlow>, GuiAxis, Alignment.CrossAxis, int) (:208),把一个 List<SimpleFlow> 按某个轴排布,供 CategoryList 之类使用。

Grid 的静态构造工具

Grid 提供 7 个静态方法把任意列表/矩阵铺成网格 (Grid.java:510-:577):

方法 行 作用
mapToMatrix(int rowLength, List<T>, IndexedElementMapper<T,I>) :510 列表按行宽折成矩阵
createGridOfElements(Iterable<? extends Iterable<T>>, GridPosElementMapper<T,I>) :514 二维集合直接建网格
createGridOfWidthElements(int width, Iterable<T>, GridPosElementMapper<T,I>) :533 按列数铺平列表
mapToMatrix(int rowLength, int size, IntFunction<I>) :555 纯下标建矩阵
createGridOfWidthHeight(int width, int height, GridPosMapper<I>) :559 指定宽高
createGridOfSizeHeight(int size, int height, GridPosMapper<I>) :573 指定元素数与高度
createGridOfSizeWidth(int size, int width, GridPosMapper<I>) :577 指定元素数与宽度

这些方法返回的是 List<List<I>>(二维列表),不是 Grid 实例—— 需要自行 .child(...) 填入 Grid。

数值

数值名 值 来源
元素间距 由 Widget 的 margin / padding 决定,布局容器无固定值 ——
对齐方式 Alignment(utils/Alignment.java),含 CrossAxis 枚举 Flow.java:208 参数
轴 GuiAxis.X / GuiAxis.Y(api/GuiAxis.java) RichTooltip.Pos 亦用它

交互

布局容器本身不处理输入,只做尺寸分配与子控件定位:

  • 尺寸计算走 widget/sizer/ 体系,见 尺寸计算
  • IPositioned.requiresResize() / scheduleResize()(api/widget/IPositioned.java:27/:29)在子控件变化时触发重排
  • coverChildrenWidth() / coverChildrenHeight()(IPositioned.java:36/:40)让容器自动贴合子控件大小

相关条目