FlowLayout.encloseRightBottom не вмещается в низ - PullRequest
2 голосов
/ 18 января 2020

У меня есть пользовательский контейнер (пузырь чата), который содержит SpanLabel. Контейнер, очевидно, растет вместе с SpanLabel

. Затем я хочу добавить небольшую метку в правом нижнем углу контейнера (отметку времени), используя

LayeredLayout.encloseIn(this, FlowLayout.encloseRightBottom(timeStampLabel));.

Я следовал примеру, показанному в https://www.codenameone.com/javadoc/com/codename1/ui/layouts/LayeredLayout.html

Это позволяет установить метку времени справа, но не внизу. Я подозреваю, что это может иметь какое-то отношение к SpanLabel вычислению его высоты? Я вставлю свой код внизу. Спасибо!

enter image description here

public class ChatBubble extends Container {

String _timestamp;
public ChatBubble(Boolean left, String text, String timestamp)
{
    _timestamp = timestamp;
    if(left)
        this.setUIID("ChatLeft");
    else
        this.setUIID("ChatRight");
    this.add(new SpanLabel(text+"         "));
}
public Container getBubble()
{
    Font smallSystemFont = Font.createSystemFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_SMALL);
    Label timeStampLabel = new Label(_timestamp);
    timeStampLabel.getAllStyles().setFgColor(0x888888);
    timeStampLabel.getAllStyles().setFont(smallSystemFont);

    return LayeredLayout.encloseIn(this,
            FlowLayout.encloseRightBottom(timeStampLabel));
}
}

...

ChatBubble bubble4 = new ChatBubble(false,"This is a very long stringThis is a very long stringThis is a very long stringThis is a very long stringThis is a very long string","11:42");
boxCenter.add(bubble4.getBubble());

1 Ответ

1 голос
/ 18 января 2020

Макет потока работает правильно, но из-за метки диапазона ему сложно правильно рассчитать высоту родительского контейнера на ранней стадии макета, поскольку это зависит от длины текста + ширины родителя. Таким образом, вы в конечном итоге с неправильной позиции. Обходной путь может заключаться в использовании детерминированной компоновки c, такой как:

return LayeredLayout.encloseIn(this,
        BorderLayout.south(
             FlowLayout.encloseRightBottom(timeStampLabel)));

. Другой подход заключается в использовании чего-то вроде компонента расширенного текста вместо SpanLabel + вмещающего макета. Например, https://www.codenameone.com/blog/tip-rich-view-revisited.html

Затем вы можете просто добавить строку в конец текста в другом формате.

...