2014-05-21 5 views
5

Se ho un oggetto con la proprietà BigDecimal, desidero visualizzarlo in un Table con una formattazione specifica: 2 frazioni e un segno "+" o "-" in base all'importo.Come formattare i valori della tabella in vaadin?

esempio: +10.50, -3.20

come può essere raggiunto in una tabella Vaadin? Esiste un metodo table.setConverter(..), ma questo in realtà dovrebbe forzare la conversione tra ad esempio uno BigDecimal.class e uno String.class. Quello che mi preme di più è solo un formattatore di viste che mostra solo i dati dell'oggetto in modo diverso.

risposta

6

Override il metodo protetto 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); 
    } 
} 

Vedi Libro di Vaadin sezione 5.16.6. Formatting Table Columns.

+0

Ok questo è fantastico finora.Ma: cosa succede se voglio solo visualizzare i segni "+" e "-" per una colonna specifica, e tutte le altre colonne 'BigDecimal' non dovrebbero mostrare questi segni? – membersound

+1

@membersound, utilizzare 'a_col_id' per determinare la colonna a cui appartiene il valore. – hmjd

+0

Vedo, funziona! – membersound

0

È necessario scrivere la propria classe di tabella che si estende Table e sovrascrivere formatPropertyValue(Object rowId, Object colId, Property<?> property).

Vedere sezione 5.15.6 nel book of Vaadin

9

Mentre usando Table.formatPropertValue() per colonne della tabella formattazione è una valida opzione, ho scoraggiare fortemente di utilizzare questo metodo quando si lavora con Vaadin 7. formatPropertValue() è il vecchio Vaadin 6 modo di formattazione Valori della tabella Questo metodo è ancora disponibile in Vaadin 7 per compatibilità verso il basso. L'utilizzo di questo metodo è problematico in diversi modi:

  • Non è un file tipografico. Poiché si ottiene solo un Property<?> come parametro, è necessario innanzitutto verificare il tipo concreto del valore della proprietà.
  • È necessario ereditare dalla tabella solo per adattare la formattazione di una o più colonne. L'ereditarietà di classe è sicuramente l'approccio sbagliato per adattare il comportamento di una classe per un particolare caso d'uso. Se hai più di uno di questi casi, finirai per implementare una serie di sottoclassi di Table che in seguito non potranno essere facilmente intercambiate.
  • Codice di conversione hard-wire (da BigDecimal a String) all'implementazione concreta di alcuni componenti dell'interfaccia utente. Questo è male per il riutilizzo. Che cosa succede se hai bisogno di quella conversione in qualche altro posto, ad esempio quando visualizzi un BigDecimal su un'etichetta? Dovresti duplicare questo codice o in qualche modo estrarlo in una classe o un metodo separato.

L'ultimo punto è esattamente ciò che Vaadin 7 fa per te: mantenere la logica di conversione separata da qualche componente UI concreto. Questo è ciò che l'interfaccia com.vaadin.data.util.converter.Converter è per. Quindi, l'OP aveva perfettamente ragione nel suo primo assunto: Table.setConverter() è la via da seguire con Vaadin 7. I convertitori sono di tipo standard e consentono la separazione delle preoccupazioni.

L'obiezione che il convertitore che può essere impostato con Table.setConverter() converta solo da BigDecimal a String non è giustificato in questo caso. Table.formatPropertValue() non fa nulla di diverso, si converte anche in stringa. Ma questo è ovvio, una tabella non mostra nulla di diverso dai dati di stringa nelle sue colonne. Di fatto, il comportamento predefinito di Table consiste nel chiamare il metodo toString() nei tipi di valore Property che non è in grado di convertire autonomamente.

Per utilizzare i convertitori, vedere section 9.2.3 of the Book of Vaadin.

+0

+1, molto utile. –

+0

Penso che l'OP volesse dire che usare un 'Convertitore' implica che è necessario implementare la conversione nell'altra direzione per soddisfare l'interfaccia. – herman

+0

Forse. In ogni caso, si risparmia l'uso di un 'Convertitore' solo in una direzione, purché non venga utilizzato sui componenti del campo. Entrambi i metodi di conversione di 'Converter' potrebbero generare un'eccezione UnsupportedOperationException. A volte non è nemmeno possibile convertire i dati di presentazione nei dati del modello. –