Выровняйте виджеты вдоль базовой линии поля в Vaadin Flow 12 - PullRequest
0 голосов
/ 16 декабря 2018

Я пытаюсь выровнять по вертикали в пределах HorizontalLayout в Vaadin 12.

В большинстве приложений, которые я могу себе представить, имеет смысл расположить виджеты вдоль базовой линии текстовых полей, поскольку текстовые поля имеют тенденцию управлять макетом большинства приложений, и особенно бизнес-приложений.

Так что я был рад найти FlexComponent.Alignment.BASELINE, предложенный для HorizontalLayout.Но когда я попробовал это в приложении Vaadin 12.0.2, базовая линия, кажется, все , кроме текстовое поле.

imageHorizontalLayout bars, one for each value in the FlexComponent.Alignment enum">

Вот пример приложения.Я загрузил сгенерированный базовый стартер и ничего не трогал, кроме содержимого конструктора MainView.

Приложение состоит из VerticalLayout, состоящего из шести HorizontalLayout объектов.Каждая горизонтальная полоса - это Label, TextField, Button и Button.Ярлык и первая кнопка имеют вертикальное выравнивание, установленное явно.

Используйте край другого окна поверх окна, которое вы сейчас просматриваете, используя его верхний край, как линейку.Обратите внимание, как выглядит строка «BASELINE», чтобы выровнять явно установленные виджеты (метка и первая кнопка) с базовой линией заголовка поля, а не самого поля, и с базовой линией текста последней кнопки.

Итак, выравнивание BASELINE выравнивает базовую линию всего , но текстового поля.Это прямо противоположно тому, что я ожидаю и нуждаюсь.

➥ Это функция или ошибка?

➥ Я что-то не так делаю?

➥ Есть ли способ заставить виджеты выровняться с базовой линией TextField?

Как незначительная дополнительная проблема, STRETCH, похоже, не имеет никакого эффекта.Что он должен делать?

Код

package work.basil.example.bugsy;

import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.html.Label;
import com.vaadin.flow.component.orderedlayout.FlexComponent;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.router.Route;
import com.vaadin.flow.server.PWA;

/**
 * The main view contains a button and a click listener.
 */
@Route ( "" )
@PWA ( name = "Project Base for Vaadin Flow",
    shortName = "Project Base" )
public class MainView extends VerticalLayout {

    public MainView () {
        this.setSpacing( true );
        this.setMargin( true );

        for ( FlexComponent.Alignment a : FlexComponent.Alignment.values() ) {
            Label label = new Label( a.name() );
            TextField field = new TextField( "field" );
            Button alignedButton = new Button( "aligned" );
            Button unalignedButton = new Button( "unaligned" );

            HorizontalLayout horizontalLayout = new HorizontalLayout();
            horizontalLayout.add( label , field , alignedButton , unalignedButton );
            // Set vertial alignment of the label and the first button.
            horizontalLayout.setVerticalComponentAlignment( a , label );
            horizontalLayout.setVerticalComponentAlignment( a , alignedButton );

            this.add( horizontalLayout );
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

➥ Это функция или ошибка?

Это ошибка.

➥ Я что-то не так делаю?

Не думай так.Я настрою проект Flow, чтобы проверить это.

➥ Есть ли способ заставить виджеты выровняться по базовой линии TextField?

Не уверенесли есть разница, что вы, кажется, устанавливаете выравнивание для отдельных компонентов по сравнению с настройкой «глобально» для всего макета (align-self против align-items в CSS).

Как второстепенныйсторона проблемы, STRETCH, кажется, не имеет никакого эффекта.Что он должен делать?

При растяжении компонент должен расти вертикально, чтобы соответствовать самому высокому элементу в строке.


Вот тестовый пример только на стороне клиента,который по крайней мере работает как ожидалось:

https://conscious -seeker.glitch.me

https://glitch.com/edit/#!/conscious-seeker

0 голосов
/ 16 декабря 2018

Заголовок в поле искажает макет

Проблема в вашем примере - это заголовок TextField.

Ответ от Jouni объясняет, что это ошибка.

Обходной путь

В качестве обходного пути удалите подпись из виджета TextField.

В вашем примере кода просто измените это:

TextField field = new TextField( "field" );

… на это:

TextField field = new TextField();

Теперь раскладка разумна, ведет себя так, как вы ожидали.

imageTextField">

Это небольшая досадная ошибка, когда по иронии судьбы важный элемент наименьшего (заголовок поля) захватывает алгоритм компоновки.Но, по крайней мере, у нас есть обходной путь, пока не появится исправление: избегайте использования надписей на полях.

...