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.

4 myśli na temat “Panele i Layouty w Vaadin, czyli na chuj mi ten wrzątek… łaaaaa!!!!!

  1. Czytaj dokumentację, tam napisali, że captionami zarządza właśnie layout 🙂

  2. I tak i nie. Ponieważ tu masz dwa poziomy. Pierwszy to poziom layoutu używanego w komponencie, a drugi to wewnętrzny layout w ramach panelu. Problemem jest ten drugi, który wymaga grzebania w mechanizmie renderowania.

Napisz odpowiedź

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax