[quote=sergiotaborda][quote=eclipso]Eu acho mais organizado implementar o listner na própria interface, você evita a utilização de uma pancada de classes internas.
Implementando um ActionListner, por exmeplo…Eu implemento o método actionPerformed e dentro coloco os IF´s…Só que cada IF chama um método específico para o tratamento de um botão específico, por exemplo.
Todo o ActionEvent passa antes pela seleção e depois cai em seu método de tratamento específico… [/quote]
Esta forma de implementar listeners em swing tem vários problemas, mas o principal é que não ha controle sobre a acção. Action é um objeto que é muito mais que um listener. ele controla o estado dos botões associados a ele. De todos os botões associados a ele. É mais simples.
Outro problema é ineficencia. Se tiver N if e a acção mais frequente é a ultima vc corre N-1 ifs completamente sem propósito. Com um listener para cada ação vc nem sequer tem if. Um ganho absurdo de eficiencia.
além disso os if se apoiam em comparação de objetos. Para isso é preciso ter acesso às referencias originais o que leva o programador a criar inner-classes para tratar eventos. Pior, faz o próprio objeto implementar a interface de listener. Tudo isto são anti-paterns em swing.
As classes de frame ficam enormes e é estremamente dificil dar manutenção.
O swing usa o padrão composite para definir JComponent. Tire vantagem disso. Construa as intefaces com um builder ou uma factory. Faça associação de listeners com o component de forma desacoplada. não use if nem ==
É muito , muito mais simples porque na manutenção basta mudar a factory ou o builder para criar telas diferentes ou com mais/ menos coisas. Ha herança das factories , etc… o Swing foi desenhado como uma API base , não se devem usar os seus componentes directamente ( a menos que estejamos criando algo muito, muito, simples ou experimental)
[/quote]
Pensei um pouco melhor e acho que compreendi o que você sugeriu, Sérgio.
Seria algo mais ou menos assim:
class XYZButton extends JButton {
ActionListener listener;
XYZButton (ActionListener listener) {
this.listener = listener;
this.addActionListener(listener);
}
}
class XYZListener implements ActionListener {
public void actionPerformed(ActionEvent evt) {
//invocar controllers
}
}
E aí, na Factory eu instanciaria o botão e associaria ao evento. É por aí, né?
O XYZListener não poderia ser considerado uma Estratégia (Strategy) do componente nesse caso? Logicamente seria mais interessante acrescentar um setActionListener pra poder mudar o comportamento do componente em tempo de execução…
Falou.