[RESOLVIDO]ObjectTableModel: BigDecimal + MethodHandler

Olá,

Gostaria de colocar um objeto BigDecimal em um JTable usando o retorno de um método, mas não estou conseguindo. Se eu remover o accessMethod eu consigo fazer funcionar … Estou usando o ObjectTableModel. Aqui vai o código.

@Entity
public class MaquinaLocacao {
	
	@Transient
	@Resolvable(colName="Valor", formatter=BigDecimalFormatter.class, accessMethod=MethodHandler.class)
	private BigDecimal valorDoPeriodo;
	
	@Transient
	@Resolvable(colName="Total", formatter=BigDecimalFormatter.class, accessMethod=MethodHandler.class)
	private BigDecimal valorTotal = new BigDecimal(0.0);
	
	public BigDecimal getValorTotal() {

		BigDecimal total = new BigDecimal("0.0");
		
		// calculo
		
		return total;
	}
    
	public BigDecimal getValorDoPeriodo() {

		BigDecimal total = new BigDecimal("0.0");
		
		// calculo

		return total;
	}
}
package br.com.MDLocacoes.View;

import java.math.BigDecimal;
import com.towel.bean.Formatter;

/**
 * @author sonee
 * 
 */
public class BigDecimalFormatter implements Formatter {

	
	/* Format the given date
	 * (non-Javadoc)
	 * @see com.towel.bean.Formatter#format(java.lang.Object)
	 */
	@Override
	public String format(Object obj) {
		if(obj != null && obj instanceof BigDecimal ){
			StringBuilder str = new StringBuilder( ((BigDecimal)obj).toPlainString() );
			
			// adiciona o separador de milhão
			if( str.length() > 9 ){
				str.insert( str.length() - 9, "," );
			}
			
			// adiciona o separador de milhar
			if( str.length() > 6 ){
				str.insert( str.length() - 6, "," );
			}
			
			// adiciona o simbolo $
			str.insert( 0, "$ " );
			
			return str.toString();
		}else{
			return "1";
		}
	}
	/* Parse the given string into a valid date
	 * (non-Javadoc)
	 * @see com.towel.bean.Formatter#parse(java.lang.Object)
	 */
	@Override
	public BigDecimal parse(Object obj) {
		if( obj != null && obj instanceof String){
			return new BigDecimal( ((String)obj).replace("$ ","").replace(",", ""));
		}
		return null;
		
	}
	/* (non-Javadoc)
	 * @see com.towel.bean.Formatter#getName()
	 */
	@Override
	public String getName() {
		return "BigDecimal";
	}
}
		AnnotationResolver resolver = new AnnotationResolver(MaquinaLocacao.class);
		ObjectTableModel<MaquinaLocacao> tableMode = new ObjectTableModel<MaquinaLocacao>(resolver, "idDaMaquina,nomeDaMaquina,tipoDeLocacao,periodoDeLocacao,valorTotal");
		tabelaDeMaquinas = new JTable();
		tabelaDeMaquinas.setModel(tableMode);

Bem, até onde vi parece que está certo.

Vou criar um exemplo para tentar reproduzir o erro e lhe ajudar.

Marky,

Eu criei um projeto simples… Como vc pode ver: Se eu escolher a propriedade “total” de “Matemática” eu recebo a seguinte exception:

com.towel.el.NotResolvableFieldException: Field 'total' can't be resolved for class: test.model.Matematica. at java.lang.Class.getMethod(Unknown Source) at com.towel.el.handler.MethodHandler.getSetterMethod(MethodHandler.java:102) at com.towel.el.handler.MethodHandler.resolveField(MethodHandler.java:63) at com.towel.el.FieldResolver.<init>(FieldResolver.java:74) at com.towel.el.annotation.AnnotationResolver.resolve(AnnotationResolver.java:135) at com.towel.el.annotation.AnnotationResolver.resolve(AnnotationResolver.java:62) at com.towel.el.annotation.AnnotationResolver.resolve(AnnotationResolver.java:80) at com.towel.swing.table.ObjectTableModel.<init>(ObjectTableModel.java:36) at test.model.ObjectTableModelTest.main(ObjectTableModelTest.java:18)

Ahhhh… não tinha reparado antes:

    at com.towel.el.handler.MethodHandler.getSetterMethod(MethodHandler.java:102)  

O problema é que ele não achou o setter, adicionei o método:

public void setTotal(BigDecimal dec){}

Na classe Matematica e funcionou. Descobri que não é opcional ter um setter, o que as vezes não faz sentido para um campo final por exemplo.

Desculpe pelo incomodo.

E de qualquer forma, isso me lembra da ideia que eu tinha de suportar o resultado de um método diretamente numa das colunas da tabela.

É isso ai, se precisar de mais algo é só perguntar.

Obrigado Marky vacilo meu, deveria ter pensado nisso :slight_smile:

E de novo, muito obrigado pelo projeto o/
Abraço