Towel release 1.1

Nova versão do Towel está pronta e disponivel para Download.

Os highlights dessa versão:

JImagePanel agora tem suporte a sequencia de imagens.
Um novo componente foi adicionado no projeto, o JTableView, é uma JTable com Footer.
ObjectTableModel foi melhorado e agora implementa Iterable apra ser facil trata-lo como uma coleção.
Um pacote para suporte de sons que foi migrado do JGF do ViniGodoy.
DynamicFormatter é um formatter dinamico criado pelo Felipe Priuli.

Agradeço principalmente ao Felipe Priuli e o Marco Biscaro pela colaboração com os Java Docs, que agora estão quase completos.
Ainda não foi hospedado em nenhum lugar mas já é possivel navegar pelas classes no github e ler os docs nas próprias classes.

Veja todas as novidades dessa versão aqui.
Download disponivel pelo github.

[]'s

Legal. Achei interessante o recurso do bind. :smiley:

[]'s

Hehe

Não conhecia o projeto Towel ainda… achei legal o motivo do nome, que vi na descrição :smiley: To até pensando em ler aquele livro

Boooa.

Já está baixado.

Valeu…

Que legal, boa notícia.

Show de bola Marky!

O ObjectTableModel (o melhor model de JTable que já vi) ainda melhor!!! :smiley: :smiley: :smiley:

Parabéns!

Marky, eu estava testando a nova versão do Binder, e há algumas alterações que precisam ser feitas quanto ao exemplo de utilização do Binder.
São alguns trechos onde é preciso atualizar a sintaxe na nomenclatura de pacotes e classes.

Como testei agora o Binder, já efetuei as correções. Segue o código para você atualizar a página: http://markytechs.wordpress.com/2010/03/03/binder-2-0-agora-com-annotations/:

import java.awt.GridLayout;
import java.awt.event.*;
import javax.swing.*;
import com.towel.bind.Binder;
import com.towel.bind.annotation.*;


@Form(Pessoa.class)
// Form para Pessoa
public class PessoaForm extends JFrame {
	@Bindable(field = "nome")
	private JTextField nome;
	@Bindable(field = "idade", formatter = IntFormatter.class)
	private JTextField idade;
	@Bindable(field = "vivo")
	// o Binder assume que o JCheckBox trata-se de um atributo boolean
	private JCheckBox vivo;
	private Binder binder;
	public PessoaForm() {
		super("PessoaForm");
		nome = new JTextField(20);
		idade = new JTextField(20);
		vivo = new JCheckBox("Vivo?");
		JButton add = new JButton("Add");
		JButton load = new JButton("Load");
		setLayout(new GridLayout(4, 2));
		add(new JLabel("Nome:"));
		add(nome);
		add(new JLabel("Idade:"));
		add(idade);
		add(new JLabel());// Por causa do GridLayout
		add(vivo);
		add(add);
		add(load);
		load.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				Pessoa pessoa = new Pessoa();
				pessoa.setNome("Marky");
				pessoa.setIdade(18);
				pessoa.setVivo(true);// Claro
				binder.updateView(pessoa);
			}
		});
		add.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				Pessoa pessoa = new Pessoa();
				binder.updateModel(pessoa);
				pessoa.printAttrs();
			}
		});
		pack();
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		binder = new com.towel.bind.annotation.AnnotatedBinder(this);
	}
	public static void main(String[] args) {
		new PessoaForm().setVisible(true);
	}
	// IntFormatter sera usado para transformar a String em numero.
	public static class IntFormatter implements com.towel.bean.Formatter {
		public Object format(Object obj) {
			Integer d = (Integer) obj;
			return d.toString();
		}
		public Object parse(Object obj) {
			return Integer.valueOf(Integer.parseInt((String) obj));
		}
		public String getName() {
			return "int";
		}
	}

        


}

Opa… obrigado por avisar, corrigido.

Pow, não consigo executar… quando dou 2 cliques mostra isso (anexo)…
tô fazendo alguma besteira? :S

Towel é um framework, não um executavel.

Voce precisa adicionar ao class-path como os jars do hibernate por exemplo e utilizar os recursos.

Artigo sobre JImagePanel publicado.

Confundi com tower defense =P

Heheh… realmente os nomes parecem um pouco. :stuck_out_tongue:

Mas também pretendo atualizar o Tower Defense.

Tai um jogo dificil e viciante… rss

Muito bom… :smiley:
Ainda não estou tendo tempo para poder contribuir (trabalhando em 2 projetos!), mas está ficando muito bom mesmo!

Marky, parabéns pelo release!

Marky, o Towel já tem algum formatador de Célula da JTable padrão?
Uma coisa que é sempre um saco é formatar/criar um bando de formatadores para cada célula em uma JTable.
Imagine o seguinte:
Você um campo valor que é um BigDecimal(salvo na base de dados como Decimal), mas que para o usuário, sempre aparecerá
formatado, e ele mesmo editará o valor formatado.
Penso que poderia haver algo dessa forma:
CellFormatter(BigDecimal inputValue,String pattern)
mandando algo do tipo:
CellFormatter(11901.99,"###,###,##0.00")

e poder editar e ainda pegar de volta assim:

e cf.getOriginalContent();
//pega o texto modificado no valor do tipo de origem(no caso BigDecimal passado a CellFormatter): 11901.95

poderia haver construtores dessa forma:
CellFormatter(BigDecimal inputValue,String pattern,Font font,Color color)
para decorar um dado campo.Podia talvez passar um Locale ou um DecimalFormat(ou até um JFormattedTextField) ao construtor.
Imagine isso para CEP,CPF… ia eliminar muito retrabalho do programador. :smiley:

Hmm… ainda não tem não, mas sua idéia está anotada. Vou ver se faço isso para o proximo release.

Obrigado!

Novo artigo sobre outra novidade, o DynamicFormatter, desenvolvido por Felipe Priuli.

Ultimo artigo do release publicado, sobre a JTableView.

Lendo o artigo da JTableView, vi que podemos criar AggregateFunctions. Ao criar uma tabela, precisei de uma função similar ou CONT.VALORES do Excel.
Então fiz assim (muito simples por sinal):[code]
public class FuncCountValues implements AggregateFunc {
private int total;

@Override
public String getResult() {
return String.valueOf(total);
}

@Override
public void init() {
total = 0;
}

@Override
public void update(String obj) {
if (obj != null && !obj.isEmpty())
    total++;
}

}
[/code]Vale lembrar que, como no Excel, ela conta células que não estão vazias.
Marky pode usá-lo se quiser.
:wink: