2014-05-21 11 views
5

Jeśli mam obiekt z właściwością BigDecimal, chcę wyświetlić go w postaci Table z określonym formatowaniem: 2 ułamki i znakiem "+" lub "-" odpowiednio do kwoty.Jak sformatować wartości tabeli w vaadin?

Np +10.50, -3.20

Jak można to osiągnąć w tabeli Vaadin? Istnieje metoda table.setConverter(..), ale faktycznie wymusiłaby ona konwersję między np. BigDecimal.class i String.class. To, o co mnie bardziej interesuje, to po prostu formant widoku, który inaczej wyświetla dane obiektu.

Odpowiedz

6

Override chroniony metoda Table.formatPropertValue():

public class My_table 
    extends Table 
{ 
    @Override 
    protected String formatPropertyValue(final Object  a_row_id, 
             final Object  a_col_id, 
             final Property<?> a_property) 

    { 
     if (a_property.getType() == BigDecimal.class 
      && null != a_property.getValue()) 
     { 
      return "formatted-value"; 
     } 

     return super.formatPropertyValue(a_row_id, a_col_id, a_property); 
    } 
} 

Zobacz Księgę Vaadin sekcji 5.16.6. Formatting Table Columns.

+0

Ok, świetnie, jak na razie.Ale: co jeśli chcę wyświetlać tylko znaki "+" i "-" dla konkretnej kolumny, a wszystkie inne kolumny BigDecimal powinny nie wyświetlać tych znaków? – membersound

+1

@membersound, użyj 'a_col_id', aby określić kolumnę, do której należy wartość. – hmjd

+0

Rozumiem, działa! – membersound

0

Musisz napisać własną klasę tabeli rozszerzającą Table i zastąpić formatPropertyValue(Object rowId, Object colId, Property<?> property).

Patrz rozdział 5.15.6 w book of Vaadin

9

Podczas korzystania Table.formatPropertValue() dla kolumn tabeli formatowanie jest realną opcją, zdecydowanie zniechęcać do korzystania z tej metody pracy z Vaadin 7. formatPropertValue() jest stary Vaadin 6 sposobów formatowania Wartości tabeli. Ta metoda jest nadal dostępna w Vaadin 7 ze względu na kompatybilność w dół. Korzystanie z tej metody jest problematyczne na kilka sposobów:

  • To nie jest bezpieczne. Ponieważ jako parametr dostajesz tylko Property<?>, musisz najpierw sprawdzić konkretny typ wartości właściwości.
  • Musisz dziedziczyć tylko z tabeli, aby dostosować formatowanie jednej lub więcej kolumn. Dziedziczenie klas jest zdecydowanie niewłaściwym podejściem do dostosowania zachowania klasy do jednego konkretnego przypadku użycia. Jeśli masz więcej niż jeden taki przypadek, skończysz implementować kilka podklas Table, które później nie mogą być łatwo zamienione.
  • Twardy kod konwersji (BigDecimal do String) do konkretnej implementacji jakiegoś składnika interfejsu użytkownika. To źle wpływa na ponowne wykorzystanie. Co jeśli potrzebujesz tej konwersji w innym miejscu, na przykład kiedy wyświetlasz BigDecimal na etykiecie? Będziesz musiał skopiować ten kod lub jakoś wyodrębnić go do oddzielnej klasy lub metody.

Ostatni punkt to dokładnie to, co Vaadin 7 robi dla Ciebie: zachowaj logikę konwersji oddzielnie od jakiegoś konkretnego składnika interfejsu użytkownika. Właśnie do tego służy interfejs com.vaadin.data.util.converter.Converter. Tak więc OP miał rację w swoim pierwszym założeniu: Table.setConverter() jest sposobem, aby przejść z Vaadin 7. Konwertery są bezpieczne i pozwalają na rozdzielenie obaw.

Zarzut, że Konwerter, który można ustawić za pomocą Table.setConverter() tylko konwertuje z BigDecimal na String, nie jest w tym przypadku uzasadniony. Table.formatPropertValue() nie robi nic innego - również konwertuje na ciąg. Ale jest to oczywiste, tabela nie wyświetla w swoich kolumnach niczego poza danymi String. W rzeczywistości domyślnym zachowaniem tabeli jest wywoływanie metody wartości toString() na typy wartości, których nie można konwertować samodzielnie.

Aby użyć Konwertery, zobacz section 9.2.3 of the Book of Vaadin.

+0

+1, bardzo pomocne. –

+0

Myślę, że OP chciał powiedzieć, że użycie "Konwertera" oznacza, że ​​trzeba również zaimplementować konwersję w innym kierunku, aby spełnić wymagania interfejsu. – herman

+0

Może. W każdym razie jest to zapis, aby użyć 'Konwertera' tylko w jednym kierunku, o ile nie jest on używany w komponentach terenowych. Każda z metod konwersji "Konwertera" może rzucić wyjątek UnsupportedOperationException. Czasami nie jest możliwa konwersja danych prezentacji na dane modelu. –