2012-07-11 21 views
16

¿Cuál es la mejor manera de implementar la interfaz java.awt.event.ActionListener?¿Debería su clase implementar ActionListener o usar un objeto anónimo ActionListener clase

Haga que su clase implemente ActionListener y añadir esto como un ActionListener:

class Foo implements ActionListener{ 

    public Foo() { 
     JButton button = new JButton(); 
     button.addActionListener(this); 
    } 

    public void actionPerformed(ActionEvent e) { 

    } 
} 

o añadir un objeto de una clase ActionListener anónima:

class Foo{ 

    public Foo() { 
     JButton button = new JButton(); 
     button.addActionListener(new ActionListener() {  
      public void actionPerformed(ActionEvent e) { 

      } 
     }); 
    } 
} 

Respuesta

30

Algunos (Jeanette/kleopatra) decir a casi nunca use ActionListener, y en su lugar use Acciones como AbstractAction. Casi siempre es un mal ideal hacer que su clase de GUI implemente a sus oyentes, ya que esto rompe el Single Responsibility Principle y hace que su código sea más difícil de mantener y extender, por lo que le recomiendo encarecidamente que no lo haga.

Así, por ejemplo, una clase interna para esto:

import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import javax.swing.AbstractAction; 
import javax.swing.JButton; 

class Foo { 

    public Foo() { 
     JButton button = new JButton(new ButtonAction("Action", KeyEvent.VK_A)); 
    } 

    private class ButtonAction extends AbstractAction { 
     public ButtonAction(String name, Integer mnemonic) { 
     super(name); 
     putValue(MNEMONIC_KEY, mnemonic); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
     System.out.println("button pressed"); 
     } 
    } 

} 
+0

+1 - AbstractAction –

+0

+1 Para 'AbstractAction' y [' Single Responsibility Principle'] (http://en.wikipedia.org/wiki/Single_responsibility_principle). –

+1

Agradable, pero parece ser más complejo (en términos de mantenimiento de código) y más difícil de leer. ¿O estoy equivocado? – elias

4

Depende. Si desea reutilizar el ActionListener en varios componentes, la opción uno es mejor. Si el ActionListener solo se asociará con un botón, la opción dos está bien.

Generalmente, crearía una clase separada (o clase interna), si prevé algún crecimiento en el proyecto. No es necesario Foo para implementar ActionListener.

+2

Tener una clase gui para implementar ActionListener es solo para programas de juguete. Como él pregunta por las "mejores prácticas", no hay uso de esto en ninguna circunstancia. –

8

La segunda opción (clase anónima) es ciertamente mejor, otra opción sería tener una clase anidada dentro de Foo.

yo no iría con la primera opción por dos razones:

  • Los usuarios de Foo no deberían tener que saber que implementa ActionListener.
  • No puede implementar dos oyentes diferentes en la misma clase.
+0

Renuncié a esta respuesta por la primera razón, pero la segunda razón es simplemente equivocada. Puede verificar el origen del 'ActionEvent' y decidir la ruta del código que debe tomar.Si esa es una solución elegante es otra discusión, pero ciertamente es posible – Robin

+4

@Robin: Tienes razón, pero ese no era mi punto. Lo que quise decir es que uno no podría implementar el 'ActionListener' dos veces en la misma clase. – casablanca

Cuestiones relacionadas