Panele i Layouty w Vaadin, czyli na chuj mi ten wrzątek… łaaaaa!!!!!
Nie wiem czy to błąd projektowy czy celowe działanie czy po prostu „no niestety tak to działa”, ale natknąłem się na dość ciekawego babola w Vaadin.
Otóż w Vaadin mamy do dyspozycji dwa rodzaje kontenerów na komponenty. Pierwszy to panele, drugi layouty. To oczywiście w ogromnym uproszczeniu. W panelach można osadzić jeden komponent za pomocą metody setComponent. W layoutach można osadzić więcej komponentów za pomocą metody addComponent i jej wariacji w zależności od tego jaki dokładnie layout stosujemy. Panele domyślnie mogą zatem przechowywać tylko jeden komponent i jeżeli chcemy osadzić tam więcej komponentów musimy użyć „drabinki”, czyli w panelu osadzić layout, a w layoucie nasze komponenty.
Na chuj mi dodatkowa warstwa jednak jak chcę osadzić tylko jeden prosty komponent? Jak będę chciał umieścić na panelu np. TextField to powinno zadziałać bez szemrania!
łaaaaa!!! (nie mylić z Waaaagh!!!)
Otóż okazuje się, że można się na takim podejściu nieźle sparzyć. Jeżeli tworzymy nasz element tak jak poniżej.
Listing 1. przykładowy element strony
TextField textField = new TextField("Przykładowe pole");
panel.setComponent(textField);
To okazuje się, że nie będzie wyświetlony tytuł pola. Mam pewne podejrzenia, że winny jest mechanizm renderowania, ale sprawdzenie tego wymagało by grzebania się w kodzie Vaadin na co czasu nie mam. Innym tropem jest mechanizm „przechwytywania” tytułów komponentów, ale ten działa pomiędzy panelami, a nie na linii panel-komponent.
Prawidłowe rozwiązanie:
Listing 2. Poprawny kod
TextField textField = new TextField("Przykładowe pole");
VerticalLayout vl = new VerticalLayout();
vl.setSizeFull();
vl.addComponent(textField);
panel.setComponent(vl);
Dodatkowe wywołanie setSizeFull dopasowuje nam layout do panelu… to jest jeszcze mniej intuicyjne.