MultiLineLabel.java
net.minecraft.client.gui.components.MultiLineLabel
信息
- 全限定名:net.minecraft.client.gui.components.MultiLineLabel
- 类型:public interface
- 包:net.minecraft.client.gui.components
- 源码路径:src/main/java/net/minecraft/client/gui/components/MultiLineLabel.java
- 起始行号:L18
- 职责:
TODO
字段/常量
EMPTY- 类型:
MultiLineLabel - 修饰符:
public public public - 源码定位:
L19 - 说明:
TODO
- 类型:
内部类/嵌套类型
net.minecraft.client.gui.components.MultiLineLabel.TextAndWidth- 类型:
record - 修饰符:
public - 源码定位:
L122 - 说明:
TODO
- 类型:
构造器
- 无
方法
下面的方法块按源码顺序生成。
static MultiLineLabel create(Font font, Component... messages) @ L36
- 方法名:create
- 源码定位:L36
- 返回类型:MultiLineLabel
- 修饰符:static
参数:
- font: Font
- messages: Component…
说明:
TODO
static MultiLineLabel create(Font font, int maxWidth, Component... messages) @ L40
- 方法名:create
- 源码定位:L40
- 返回类型:MultiLineLabel
- 修饰符:static
参数:
- font: Font
- maxWidth: int
- messages: Component…
说明:
TODO
static MultiLineLabel create(Font font, Component message, int maxWidth) @ L44
- 方法名:create
- 源码定位:L44
- 返回类型:MultiLineLabel
- 修饰符:static
参数:
- font: Font
- message: Component
- maxWidth: int
说明:
TODO
static MultiLineLabel create(Font font, int maxWidth, int maxLines, Component... messages) @ L48
- 方法名:create
- 源码定位:L48
- 返回类型:MultiLineLabel
- 修饰符:static
参数:
- font: Font
- maxWidth: int
- maxLines: int
- messages: Component…
说明:
TODO
int visitLines(TextAlignment align, int anchorX, int topY, int lineHeight, ActiveTextCollector output) @ L115
- 方法名:visitLines
- 源码定位:L115
- 返回类型:int
- 修饰符:package-private
参数:
- align: TextAlignment
- anchorX: int
- topY: int
- lineHeight: int
- output: ActiveTextCollector
说明:
TODO
int getLineCount() @ L117
- 方法名:getLineCount
- 源码定位:L117
- 返回类型:int
- 修饰符:package-private
参数:
- 无
说明:
TODO
int getWidth() @ L119
- 方法名:getWidth
- 源码定位:L119
- 返回类型:int
- 修饰符:package-private
参数:
- 无
说明:
TODO
代码
@OnlyIn(Dist.CLIENT)
public interface MultiLineLabel {
MultiLineLabel EMPTY = new MultiLineLabel() {
@Override
public int visitLines(TextAlignment align, int anchorX, int topY, int lineHeight, ActiveTextCollector output) {
return topY;
}
@Override
public int getLineCount() {
return 0;
}
@Override
public int getWidth() {
return 0;
}
};
static MultiLineLabel create(Font font, Component... messages) {
return create(font, Integer.MAX_VALUE, Integer.MAX_VALUE, messages);
}
static MultiLineLabel create(Font font, int maxWidth, Component... messages) {
return create(font, maxWidth, Integer.MAX_VALUE, messages);
}
static MultiLineLabel create(Font font, Component message, int maxWidth) {
return create(font, maxWidth, Integer.MAX_VALUE, message);
}
static MultiLineLabel create(Font font, int maxWidth, int maxLines, Component... messages) {
return messages.length == 0
? EMPTY
: new MultiLineLabel() {
private @Nullable List<MultiLineLabel.TextAndWidth> cachedTextAndWidth;
private @Nullable Language splitWithLanguage;
@Override
public int visitLines(TextAlignment align, int anchorX, int topY, int lineHeight, ActiveTextCollector output) {
int y = topY;
for (MultiLineLabel.TextAndWidth splitLine : this.getSplitMessage()) {
int leftX = align.calculateLeft(anchorX, splitLine.width);
output.accept(leftX, y, splitLine.text);
y += lineHeight;
}
return y;
}
private List<MultiLineLabel.TextAndWidth> getSplitMessage() {
Language currentLanguage = Language.getInstance();
if (this.cachedTextAndWidth != null && currentLanguage == this.splitWithLanguage) {
return this.cachedTextAndWidth;
} else {
this.splitWithLanguage = currentLanguage;
List<FormattedText> splitMessage = new ArrayList<>();
for (Component message : messages) {
splitMessage.addAll(font.splitIgnoringLanguage(message, maxWidth));
}
this.cachedTextAndWidth = new ArrayList<>();
int actualMaxLines = Math.min(splitMessage.size(), maxLines);
List<FormattedText> linesToAdd = splitMessage.subList(0, actualMaxLines);
for (int i = 0; i < linesToAdd.size(); i++) {
FormattedText formattedText = linesToAdd.get(i);
FormattedCharSequence formattedCharSequence = Language.getInstance().getVisualOrder(formattedText);
if (i == linesToAdd.size() - 1 && actualMaxLines == maxLines && actualMaxLines != splitMessage.size()) {
FormattedText clippedText = font.substrByWidth(formattedText, font.width(formattedText) - font.width(CommonComponents.ELLIPSIS));
FormattedText withEllipsis = FormattedText.composite(
clippedText, CommonComponents.ELLIPSIS.copy().withStyle(messages[messages.length - 1].getStyle())
);
this.cachedTextAndWidth
.add(new MultiLineLabel.TextAndWidth(Language.getInstance().getVisualOrder(withEllipsis), font.width(withEllipsis)));
} else {
this.cachedTextAndWidth.add(new MultiLineLabel.TextAndWidth(formattedCharSequence, font.width(formattedCharSequence)));
}
}
return this.cachedTextAndWidth;
}
}
@Override
public int getLineCount() {
return this.getSplitMessage().size();
}
@Override
public int getWidth() {
return Math.min(maxWidth, this.getSplitMessage().stream().mapToInt(MultiLineLabel.TextAndWidth::width).max().orElse(0));
}
};
}
int visitLines(TextAlignment align, int anchorX, int topY, int lineHeight, ActiveTextCollector output);
int getLineCount();
int getWidth();
@OnlyIn(Dist.CLIENT)
public record TextAndWidth(FormattedCharSequence text, int width) {
}
}引用的其他类
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Language.getInstance()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
FormattedText.composite()
- 引用位置: