GridLayout.java
net.minecraft.client.gui.layouts.GridLayout
信息
- 全限定名:net.minecraft.client.gui.layouts.GridLayout
- 类型:public class
- 包:net.minecraft.client.gui.layouts
- 源码路径:src/main/java/net/minecraft/client/gui/layouts/GridLayout.java
- 起始行号:L14
- 继承:AbstractLayout
- 职责:
TODO
字段/常量
-
children- 类型:
List<GridLayout.ChildContainer> - 修饰符:
private final - 源码定位:
L15 - 说明:
TODO
- 类型:
-
defaultCellSettings- 类型:
LayoutSettings - 修饰符:
private final - 源码定位:
L16 - 说明:
TODO
- 类型:
-
rowSpacing- 类型:
int - 修饰符:
private - 源码定位:
L17 - 说明:
TODO
- 类型:
-
columnSpacing- 类型:
int - 修饰符:
private - 源码定位:
L18 - 说明:
TODO
- 类型:
内部类/嵌套类型
-
net.minecraft.client.gui.layouts.GridLayout.ChildContainer- 类型:
class - 修饰符:
private static - 源码定位:
L158 - 说明:
TODO
- 类型:
-
net.minecraft.client.gui.layouts.GridLayout.RowHelper- 类型:
class - 修饰符:
public final - 源码定位:
L182 - 说明:
TODO
- 类型:
构造器
public GridLayout() @ L20
- 构造器名:GridLayout
- 源码定位:L20
- 修饰符:public
参数:
- 无
说明:
TODO
public GridLayout(int x, int y) @ L24
- 构造器名:GridLayout
- 源码定位:L24
- 修饰符:public
参数:
- x: int
- y: int
说明:
TODO
方法
下面的方法块按源码顺序生成。
public void arrangeElements() @ L28
- 方法名:arrangeElements
- 源码定位:L28
- 返回类型:void
- 修饰符:public
参数:
- 无
说明:
TODO
public <T extends LayoutElement> T addChild(T child, int row, int column) @ L95
- 方法名:addChild
- 源码定位:L95
- 返回类型:
T - 修饰符:public
参数:
- child: T
- row: int
- column: int
说明:
TODO
public <T extends LayoutElement> T addChild(T child, int row, int column, LayoutSettings cellSettings) @ L99
- 方法名:addChild
- 源码定位:L99
- 返回类型:
T - 修饰符:public
参数:
- child: T
- row: int
- column: int
- cellSettings: LayoutSettings
说明:
TODO
public <T extends LayoutElement> T addChild(T child, int row, int column, Consumer<LayoutSettings> layoutSettingsAdjustments) @ L103
- 方法名:addChild
- 源码定位:L103
- 返回类型:
T - 修饰符:public
参数:
- child: T
- row: int
- column: int
- layoutSettingsAdjustments: Consumer
说明:
TODO
public <T extends LayoutElement> T addChild(T child, int row, int column, int rows, int columns) @ L107
- 方法名:addChild
- 源码定位:L107
- 返回类型:
T - 修饰符:public
参数:
- child: T
- row: int
- column: int
- rows: int
- columns: int
说明:
TODO
public <T extends LayoutElement> T addChild(T child, int row, int column, int rows, int columns, LayoutSettings cellSettings) @ L111
- 方法名:addChild
- 源码定位:L111
- 返回类型:
T - 修饰符:public
参数:
- child: T
- row: int
- column: int
- rows: int
- columns: int
- cellSettings: LayoutSettings
说明:
TODO
public <T extends LayoutElement> T addChild(T child, int row, int column, int rows, int columns, Consumer<LayoutSettings> layoutSettingsAdjustments) @ L122
- 方法名:addChild
- 源码定位:L122
- 返回类型:
T - 修饰符:public
参数:
- child: T
- row: int
- column: int
- rows: int
- columns: int
- layoutSettingsAdjustments: Consumer
说明:
TODO
public GridLayout columnSpacing(int columnSpacing) @ L126
- 方法名:columnSpacing
- 源码定位:L126
- 返回类型:GridLayout
- 修饰符:public
参数:
- columnSpacing: int
说明:
TODO
public GridLayout rowSpacing(int rowSpacing) @ L131
- 方法名:rowSpacing
- 源码定位:L131
- 返回类型:GridLayout
- 修饰符:public
参数:
- rowSpacing: int
说明:
TODO
public GridLayout spacing(int spacing) @ L136
- 方法名:spacing
- 源码定位:L136
- 返回类型:GridLayout
- 修饰符:public
参数:
- spacing: int
说明:
TODO
public void visitChildren(Consumer<LayoutElement> layoutElementVisitor) @ L140
- 方法名:visitChildren
- 源码定位:L140
- 返回类型:void
- 修饰符:public
参数:
- layoutElementVisitor: Consumer
说明:
TODO
public LayoutSettings newCellSettings() @ L145
- 方法名:newCellSettings
- 源码定位:L145
- 返回类型:LayoutSettings
- 修饰符:public
参数:
- 无
说明:
TODO
public LayoutSettings defaultCellSetting() @ L149
- 方法名:defaultCellSetting
- 源码定位:L149
- 返回类型:LayoutSettings
- 修饰符:public
参数:
- 无
说明:
TODO
public GridLayout.RowHelper createRowHelper(int columns) @ L153
- 方法名:createRowHelper
- 源码定位:L153
- 返回类型:GridLayout.RowHelper
- 修饰符:public
参数:
- columns: int
说明:
TODO
代码
@OnlyIn(Dist.CLIENT)
public class GridLayout extends AbstractLayout {
private final List<GridLayout.ChildContainer> children = new ArrayList<>();
private final LayoutSettings defaultCellSettings = LayoutSettings.defaults();
private int rowSpacing = 0;
private int columnSpacing = 0;
public GridLayout() {
this(0, 0);
}
public GridLayout(int x, int y) {
super(x, y, 0, 0);
}
@Override
public void arrangeElements() {
super.arrangeElements();
int maxRow = 0;
int maxColumn = 0;
for (GridLayout.ChildContainer child : this.children) {
maxRow = Math.max(child.getLastOccupiedRow(), maxRow);
maxColumn = Math.max(child.getLastOccupiedColumn(), maxColumn);
}
int[] maxColumnWidths = new int[maxColumn + 1];
int[] maxRowHeights = new int[maxRow + 1];
for (GridLayout.ChildContainer child : this.children) {
int childHeight = child.getHeight() - (child.occupiedRows - 1) * this.rowSpacing;
Divisor heightDivisor = new Divisor(childHeight, child.occupiedRows);
for (int row = child.row; row <= child.getLastOccupiedRow(); row++) {
maxRowHeights[row] = Math.max(maxRowHeights[row], heightDivisor.nextInt());
}
int childWidth = child.getWidth() - (child.occupiedColumns - 1) * this.columnSpacing;
Divisor widthDivisor = new Divisor(childWidth, child.occupiedColumns);
for (int column = child.column; column <= child.getLastOccupiedColumn(); column++) {
maxColumnWidths[column] = Math.max(maxColumnWidths[column], widthDivisor.nextInt());
}
}
int[] columnXOffsets = new int[maxColumn + 1];
int[] rowYOffsets = new int[maxRow + 1];
columnXOffsets[0] = 0;
for (int column = 1; column <= maxColumn; column++) {
columnXOffsets[column] = columnXOffsets[column - 1] + maxColumnWidths[column - 1] + this.columnSpacing;
}
rowYOffsets[0] = 0;
for (int row = 1; row <= maxRow; row++) {
rowYOffsets[row] = rowYOffsets[row - 1] + maxRowHeights[row - 1] + this.rowSpacing;
}
for (GridLayout.ChildContainer child : this.children) {
int availableWidth = 0;
for (int column = child.column; column <= child.getLastOccupiedColumn(); column++) {
availableWidth += maxColumnWidths[column];
}
availableWidth += this.columnSpacing * (child.occupiedColumns - 1);
child.setX(this.getX() + columnXOffsets[child.column], availableWidth);
int availableHeight = 0;
for (int row = child.row; row <= child.getLastOccupiedRow(); row++) {
availableHeight += maxRowHeights[row];
}
availableHeight += this.rowSpacing * (child.occupiedRows - 1);
child.setY(this.getY() + rowYOffsets[child.row], availableHeight);
}
this.width = columnXOffsets[maxColumn] + maxColumnWidths[maxColumn];
this.height = rowYOffsets[maxRow] + maxRowHeights[maxRow];
}
public <T extends LayoutElement> T addChild(T child, int row, int column) {
return this.addChild(child, row, column, this.newCellSettings());
}
public <T extends LayoutElement> T addChild(T child, int row, int column, LayoutSettings cellSettings) {
return this.addChild(child, row, column, 1, 1, cellSettings);
}
public <T extends LayoutElement> T addChild(T child, int row, int column, Consumer<LayoutSettings> layoutSettingsAdjustments) {
return this.addChild(child, row, column, 1, 1, Util.make(this.newCellSettings(), layoutSettingsAdjustments));
}
public <T extends LayoutElement> T addChild(T child, int row, int column, int rows, int columns) {
return this.addChild(child, row, column, rows, columns, this.newCellSettings());
}
public <T extends LayoutElement> T addChild(T child, int row, int column, int rows, int columns, LayoutSettings cellSettings) {
if (rows < 1) {
throw new IllegalArgumentException("Occupied rows must be at least 1");
} else if (columns < 1) {
throw new IllegalArgumentException("Occupied columns must be at least 1");
} else {
this.children.add(new GridLayout.ChildContainer(child, row, column, rows, columns, cellSettings));
return child;
}
}
public <T extends LayoutElement> T addChild(T child, int row, int column, int rows, int columns, Consumer<LayoutSettings> layoutSettingsAdjustments) {
return this.addChild(child, row, column, rows, columns, Util.make(this.newCellSettings(), layoutSettingsAdjustments));
}
public GridLayout columnSpacing(int columnSpacing) {
this.columnSpacing = columnSpacing;
return this;
}
public GridLayout rowSpacing(int rowSpacing) {
this.rowSpacing = rowSpacing;
return this;
}
public GridLayout spacing(int spacing) {
return this.columnSpacing(spacing).rowSpacing(spacing);
}
@Override
public void visitChildren(Consumer<LayoutElement> layoutElementVisitor) {
this.children.forEach(child -> layoutElementVisitor.accept(child.child));
}
public LayoutSettings newCellSettings() {
return this.defaultCellSettings.copy();
}
public LayoutSettings defaultCellSetting() {
return this.defaultCellSettings;
}
public GridLayout.RowHelper createRowHelper(int columns) {
return new GridLayout.RowHelper(columns);
}
@OnlyIn(Dist.CLIENT)
private static class ChildContainer extends AbstractLayout.AbstractChildWrapper {
private final int row;
private final int column;
private final int occupiedRows;
private final int occupiedColumns;
private ChildContainer(LayoutElement widget, int row, int column, int occupiedRows, int occupiedColumns, LayoutSettings cellSettings) {
super(widget, cellSettings.getExposed());
this.row = row;
this.column = column;
this.occupiedRows = occupiedRows;
this.occupiedColumns = occupiedColumns;
}
public int getLastOccupiedRow() {
return this.row + this.occupiedRows - 1;
}
public int getLastOccupiedColumn() {
return this.column + this.occupiedColumns - 1;
}
}
@OnlyIn(Dist.CLIENT)
public final class RowHelper {
private final int columns;
private int index;
private RowHelper(int columns) {
Objects.requireNonNull(GridLayout.this);
super();
this.columns = columns;
}
public <T extends LayoutElement> T addChild(T widget) {
return this.addChild(widget, 1);
}
public <T extends LayoutElement> T addChild(T widget, int columnWidth) {
return this.addChild(widget, columnWidth, this.defaultCellSetting());
}
public <T extends LayoutElement> T addChild(T widget, LayoutSettings layoutSettings) {
return this.addChild(widget, 1, layoutSettings);
}
public <T extends LayoutElement> T addChild(T widget, int columnWidth, LayoutSettings layoutSettings) {
int row = this.index / this.columns;
int columnBegin = this.index % this.columns;
if (columnBegin + columnWidth > this.columns) {
row++;
columnBegin = 0;
this.index = Mth.roundToward(this.index, this.columns);
}
this.index += columnWidth;
return GridLayout.this.addChild(widget, row, columnBegin, 1, columnWidth, layoutSettings);
}
public GridLayout getGrid() {
return GridLayout.this;
}
public LayoutSettings newCellSettings() {
return GridLayout.this.newCellSettings();
}
public LayoutSettings defaultCellSetting() {
return GridLayout.this.defaultCellSetting();
}
}
}引用的其他类
-
- 引用位置:
构造调用 - 关联成员:
Divisor()
- 引用位置:
-
- 引用位置:
继承
- 引用位置:
-
- 引用位置:
参数/返回值
- 引用位置:
-
- 引用位置:
参数/字段/方法调用/返回值 - 关联成员:
LayoutSettings.defaults()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Mth.roundToward()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Util.make()
- 引用位置: