2009-01-15 12 views
7

Meine aktuelle Anwendung hat einen JFrame mit etwa 15 Aktionen, die als Felder innerhalb des JFrames gespeichert sind. Jede der Aktionen ist eine anonyme Klasse und einige von ihnen sind ziemlich lang.Organisieren von Aktionen in einer Swing-Anwendung?

Ist es üblich, Aktionen in ihre eigenen Klassen zu brechen, möglicherweise innerhalb eines Unterpakets namens Aktionen?

Wenn nicht, wie wird diese Komplexität normalerweise gezähmt?

Dank

Antwort

8

Wenn es möglich ist, dass Ihre Aktionen wiederverwendbar sind (z. B. über Tastaturkürzel, andere Menüs, andere Dialoge usw.) und insbesondere wenn sie direkt auf dem zugrunde liegenden Modell (statt auf der Benutzeroberfläche) arbeiten können, dann Es ist im Allgemeinen besser, sie nicht als anonyme Klassen zu haben.

Stattdessen erstellen Sie ein separates Paket und erstellen Sie Klassen für jede.

Oft ist es auch sinnvoll, diese nicht direkt zu instanziieren, sondern eine Art Manager zu haben, der Konstanten definiert und Aktionssätze initialisiert und zurückgibt, so dass Sie beispielsweise unterschiedliche Aktionssätze bei verschiedenen Versionen anbieten können Legen Sie bestimmte Aktionen nur für interne Releases fest.

Überprüfen Sie abschließend, ob Ihre Aktionen in eine Klassenhierarchie umgestaltet werden können. Sie können dies oft tun, wodurch die Code-Replikation gespart wird, und Sie können auch Robustheit hinzufügen (z. B. nach bestimmten Bedingungen suchen, bevor die Aktion ausgeführt wird).

+0

Ich denke, vielleicht als Alternative oder zusätzlich zum ActionManager, Aktionen sind gute Kandidaten, um in eine Ansicht injiziert werden, zum Beispiel mit Spring. – ktulinho

4

Das ist typisch wie ich es mache. Jede Aktion erhält ihre eigene Klasse, die einen Verweis auf das "App" -Objekt hat, damit sie zu Ressourcen gelangen kann, die sie benötigt. Ich habe normalerweise einen Aktionsmanager, der alle Aktionen enthält, so dass es einen Ort gibt, an dem man auf sie zugreifen kann, sowie einen Ort, an dem sie ihre Fähigkeiten und Zeug aktualisieren können.

Schließlich wird dies auch nicht mehr handhabbar, zu welchem ​​Zeitpunkt sollten Sie anfangen, über ein App-Framework wie Eclipse RCP, das NetBeans-Framework, JIDE usw. zu denken. Dies gilt insbesondere, wenn Sie benutzerdefinierte Tastaturbelegungen und ähnliches unterstützen wollen .

2

Was ich mache, ist ein Paket (eigentlich Paketbaum) für Action-Klassen zu erstellen, dann instanziieren Sie jede Klasse nach Kontext. Fast alle meine Aktionsklassen sind abstrakt mit abstrakten Methoden, um den Kontext zu erhalten (ala 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); 
    } 
}); 
//... 

(Entschuldigung für Fehler, ich habe es von Hand in dieses Textfeld geschrieben, nicht in einer IDE).

Verwandte Themen