2009-07-30 11 views
6

¡¡Un grito a los gurús Swing !!Comandos de acción vs clases de acción?

He estado haciendo la programación de Swing durante varios años, pero siempre he tenido dudas al respecto.

Como sabe, Swing/AWT le ofrece varias formas de ejecutar una acción en particular cuando se hace clic en un botón. Lo he visto hecho de diferentes maneras en las aplicaciones en las que he trabajado. El proyecto actualmente estoy trabajando en tiende a seguir este enfoque:

someButton.setActionCommand("mycommand"); 
someButton.addActionListener(listener); 

--snip--

public void actionPerformed(ActionEvent event) { 
    String command = event.getActionCommand(); 
    if (command.equals("mycommand")) 
     doThis(); 
    else if (command.equals("someothercommand")) 
     doThat(); 
etc. 

Esto parece un poco torpe para mí - ¿hay algún beneficio de este estilo de programación ¿O es mejor usar Swing Action s?

¿O hay diferentes situaciones donde los diferentes enfoques son mejores/peores?

+0

Creo que solo necesita usar su discreción para decidir cuándo es apropiado. No creo que haya ningún bien o mal como tal, es solo una de esas muchas cosas en las que los programadores tienen preferencias personales, pero como dijo Brandon, si tienes varios botones que hacen lo mismo, tendría sentido usar una sola acción. ¡oyente! – Andy

Respuesta

4

IMO, es mejor usar oyentes por separado para Acciones.

De esta manera, deja la delegación de qué acción debería suceder hasta Swing. No tiene que comparar cadenas para decidir qué hacer.

Tener una gran ActionListener para más de una acción es como romper el patrón para mí.

+1

Además, permite que el código en el oyente de acción sea más grande o que la delegación se mantenga internamente. Creo que la razón principal para usar el elemento de comando es si hay diferentes comandos que pueden causar acciones del mismo componente. Sin embargo, fuera de mi cabeza no puedo pensar en uno que sea inherente a Swing/AWT. – aperkins

3

Desde el punto de vista del diseño, creo que es mejor tener una clase para manejar una acción específica para un componente en lugar de una clase que tiene el tipo de diseño "permite manejar todo para todos los componentes aquí".

También, si usa Action puede a) aplicarlo a más de un componente (por ejemplo, un botón y un elemento de menú) b) llamar al setEnable para habilitarlo/deshabilitarlo para todos los componentes y c) También use para definir varias configuraciones en los componentes a los que se adjunta (a saber, la etiqueta de texto, el texto de información sobre herramientas, la tecla del acelerador, el icono, etc.). Este último se realiza a través del método putValue y llamar de nuevo a este método cambiará la configuración de todos los componentes a los que está conectado.

Específicamente, aconsejaría la subclase AbstractAction para sus necesidades.

0

su útil si tiene varios botones o componentes que realizan la misma acción (es decir. Varios botones de salida en la misma página se use el mismo código)

ellos configurados con la misma acción de mando y todos ellos tendrán utilizar el mismo código en el oyente

JButton.addActionListener(this); 
JButton2.addActionListener(this); 
JButton.setActionCommand("exit"); 
JButton2.setActionCommand("exit"); 

public void ActionPerformed(ActionEvent e){ 
    if(e.getActionCommand=="exit") 
     System.exit(0); 
} 
+0

No, si realizan la misma acción ... denles el mismo oyente de acción .... no hay necesidad de cadenas de comandos – jjnguy

+0

Ok gracias, sigo aprendiendo y esto es lo que me enseñaron que se usaron :) – Brandon

+0

Puede ser útil ... pero sería mejor darle al oyente los dos componentes. – jjnguy

1

sé que es el código de demostración, pero ya que estamos trabajando en esto pensé que me gustaría mencionar que la oscilación tiende a ser muy repetitiva si usted no tiene cuidado.

El uso de clases de acción tiende a permitirle refactorizar mejor. En swing, una de las mejores formas de comenzar es garantizar que NO haya cadenas en su código. Casi todos los "Nuevos" estarán en un bucle de algún tipo, leyendo de un conjunto de datos (a menudo el conjunto de datos es tan simple como un conjunto): una vez que comienzas a leer de un conjunto de datos así, las acciones pueden ayudarte mucho.

Utiliza los datos para crear su acción, los datos para crear su control y los datos para asociar los dos, de esta manera puede terminar muy cerca de (o en) 0 líneas de código para un nuevo control.

Una vez que comience a programar de esta manera y pueda ver los patrones, es al menos tan rápido como la manera repetitiva y mucho menos propenso a errores.

Cuestiones relacionadas