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) {
    }
}

引用的其他类