Framework Swing

Bom dia!
Sempre desenvolvi utilizando swing, mesmo em aplicações mais complexas utilizando J2EE…
Hoje estou envolvido em desenvolvimento Web utilizando struts, mas tenho um conhecimento
razoável em JSF também, e como consequência, em MVC.
Estou procurando a algum tempo um framework MVC para swing, e os que eu encontrei são na
maioria de pessoas que sempre trabalharam com Struts e querem “reproduzir” o struts e
suas actions com swing, o que na minha opinião não é uma boa idéia, até pelo fato de eu não
ser muito fã desse framework e achar JSF muito mais inteligente.
Outros frameworks que eu encontrei pelo caminho são sempre baseados em extender classes…
que eu também não sou muito fã.
Sei que alguns vão dizer que Swing ja é MVC e isso é uma grande discussão pelo que eu vi,
mas Swing não implementa o MVC exatamente como conhecemos, ou pelo menos, como eu gostaria!
Sei também que a especificação do JSF prevê através dos render kit que seja criado um render
kit para swing, mas não encontrei nenhum, portanto, pensei em criar algo simples e prático.

Pensei em alguma coisa do tipo:

Eu tenho uma classe (Que seria minha view)


class View {
	
	//Essa annotation implementaria o método ActionPerformed do ActionListener no controller
	@Action 
	private JButton botao1;

	//Essa annotation implementaria o método FocusLost do FocusListener no controller 
	@Action(listener=FocusListener, type=FocusLost)
	private JButton botao2;

	//Essa annotation implementaria todos os métodos do keyListener no controller
	@Action(listener=Keylistener)
	private JButton botao3;

}

class view_controller {
	
	private	void botao1_clicked(JButton botao1){
		//Aqui eu faço alguma coisa...simples porém com um grande problema descrito
		//no final da classe
	}

	private	void botao2_FocusLost(JButton botao2){
		//Aqui eu faço alguma coisa...simples porém com um grande problema descrito
		//no final da classe
	}

	private	void botao3_FocusListener(JButton botao3){
		botao3.addKeyListener(new KeyListener() {
		
			public void keyTyped(KeyEvent e) {

		
			}
		
			public void keyReleased(KeyEvent e) {

		
			}
		
			public void keyPressed(KeyEvent e) {

		
			}
		
		});
	}	


}

O Maior problema desse modelo seria acessar a partir de um método outros componentes
da minha view…por exemplo se eu tivesse eu JTextField que devesse ser preenchido quando
um botão é clicado… ou sei lá!
Pensei em três saídas:
1)Criar uma anotação para “Exportar” os componentes para o controller.Ex: @Export
Então utilizando como exemplo o botao1, ficaria assim:

	@Export
	@Action(listener=FocusListener, type=FocusLost)
	private JButton botao2;

No meu controller, ele apareceria assim:

class view_controller {
	private JButton botao2;

2)Outra solução seria gerar os getters and setters na minha classe view e exportá-la inteira
para o meu controller:

class view_controller {
	private View view;

Aí para acessar os componentes eu precisaria utilizar um view.getBotao2();

  1. Simplesmente habilitar as duas formas…

Com relação a geração do controller, idéia é que seja criada a view, e depois disso o
controller e o model são gerados automaticamente, através de um comando como no rails.
A cada alteração na minha view, eu poderia regerar o controller automaticamente, claro que
sem nunca perder o código.
A vinculação entre view, controller e model eu penso em fazer via “Convention over configuration”,
mas liberar um annotation para especificar também.
Não estou pensando no model ainda, e se eu preciso fazer alguma coisa de muito especial pois
a idéia é mais facilitar a interação entre controller e view, e facilitar a manutenção nas
duas.
Claro que tem mais um monte de coisas que imagino em fazer, afinal, essa parte fala somente
sobre as interação entre view e controller, mas tenho que começar por algum lugar!!!

O que acham ? tem utilizade? devo continuar? sugestões? críticas? to viajando?

A grande pergunta que os projetistas da sun se fizeram, e que você deve se fazer também é:
O que ganho eu tenho ao substituir o mecanismo de eventos no padrão Observer, por uma camada inteira de controle?

Eu já me fiz essa pergunta e, para o meu caso, não cheguei a uma resposta que me convencesse a tornar meu código muito mais complexo.

na verdade ja tem algo ate meio parecido. O Genesis faz algo mais ou menos assim. é bem interessante o framework.

Sua ideia ao meu ver tem um porém. Como saber qual metodo vai chamar?

Felagund ,

A minha idéia é seguir uma convenção de nomes, algo bem estilo rails! Eu saberei qual o controller pois ele terá um nome padrão, ou estará em um diretório específico, ou terá uma annotation na view dizendo qual seu nome, enfim, seguirá uma convenção que será definida.
Com os métodos deve funcionar da mesma maneira, o ActionPerformed do botao1, terá um nome padrão, algo como private void botao1_actionPerformed(JButton botao1)

Posso também configurar o nome do método na annotation, mas caso ele não esteja presente, seguirá a convenção de nomes acima citada.
Eu poderia também, disponibilizar um arquivo de configuração, no qual poderiamos configurar qual seria o padrão de nomes utilizado, seguinda também o critério de se não existir, segue o padrão do sistema, para simplificar.

Eu não conheço esse framework genesis mas pretendo dar uma olhada.

Valeu!