2009-01-15 13 views
7

Mi aplicación actual tiene un JFrame con aproximadamente 15 acciones almacenadas como campos dentro de JFrame. Cada una de las acciones es una clase anónima y algunas de ellas son bastante largas.¿Organizar acciones en una aplicación Swing?

¿Es común dividir las acciones en sus propias clases, posiblemente dentro de un subpaquete llamado acciones?

En caso negativo, ¿cómo se domestica habitualmente esta complejidad?

Gracias

Respuesta

8

Si es posible que sus acciones puedan ser reutilizables (por ejemplo, desde accesos directos de teclado, otros menús, otros diálogos, etc.) y especialmente si pueden trabajar directamente en el modelo subyacente (en lugar de en la interfaz de usuario), generalmente es mejor no tenerlos como clases anónimas.

Más bien, cree un paquete separado y cree clases para cada uno.

A menudo, también tiene sentido no crear instancias directamente, sino tener algún tipo de administrador que defina constantes e inicialice y devuelva conjuntos de acciones, para que pueda, por ejemplo, ofrecer diferentes conjuntos de acciones en diferentes versiones o establecer ciertas acciones solo para lanzamientos internos.

Finalmente, verifique si sus acciones pueden refactorizarse en una jerarquía de clases. A menudo pueden, lo que ahorra la replicación del código, y también le ayuda a agregar robustez (por ejemplo, verificar ciertas condiciones antes de dejar que la acción se ejecute).

+0

Creo que tal vez como alternativa o además del ActionManager, las acciones son buenas candidatas para ser inyectadas en una vista, usando por ejemplo Spring. – ktulinho

4

Así es como lo hago. Cada acción obtiene su propia clase que tiene una referencia al objeto "aplicación" para que pueda obtener los recursos que necesita. Por lo general, tengo un administrador de acciones que contiene todas las acciones, por lo que hay un solo lugar para acceder a ellas, así como un lugar para actualizar su habilitación y esas cosas.

Eventualmente, esto también se vuelve inmanejable, en cuyo punto debe comenzar a pensar en utilizar un marco de aplicación como Eclipse RCP, NetBeans framework, JIDE, etc. Esto es especialmente cierto si desea soportar mapas de teclas definidos por el usuario y cosas así. .

2

Lo que hago es crear un paquete (árbol de paquetes en realidad) para las clases de acción, y crear una instancia de cada clase según el contexto. Casi todas mis clases de acción son abstractas con métodos abstractos para obtener el contexto (al estilo de Spring).

public abstract class CalcAndShowAction extends AbstractAction { 
    //initialization code - setup icons, label, key shortcuts but not context. 

    public void actionPerformed(ActionEvent e) { 
     //abstract method since it needs ui context 
     String data = getDataToCalc(); 

     //the actual action - implemented in this class, 
     // along with any user interaction inherent to this action 
     String result = calc(data); 

     //abstract method since it needs ui context 
     putResultInUI(result); 
    } 
    //abstract methods, static helpers, etc... 
} 

//actual usage 
//... 
button.setAction(new CalcAndShowAction() { 
    String getDataToCalc() { 
     return textField.getText(); 
    } 

    void putResultInUI(String result) { 
     textField.setText(result); 
    } 
}); 
//... 

(lo siento por cualquier error, lo he escrito a mano en este cuadro de texto, no en un IDE).

Cuestiones relacionadas