Ich möchte ein Graph-Reader-Programm erstellen, mit dem jeder gescannte Graph mit wenig Aufwand in einen CSV konvertiert werden kann. Das folgende Diagramm beschreibt den grundlegenden Kontrollfluss
Ich habe einen Prototyp, der meine grundlegenden Anforderungen erfüllt, aber bevor ich mit der Entwicklung fortfahre, möchte ich wissen, wie GUI-Zustände und -Unterzustände am besten erhalten bleiben. Im Moment benutze ich eine enum:
%Vor% Der Controller hat ein UIState
, das durch Tasten und Maus-Listener durch Aufrufen von
Mein OptionsPanel, das Feld, das alle Schaltflächen und Eingabefelder enthält, beobachtet den Controller und ruft einen großen Schalter auf, wenn er Änderungen beobachtet:
%Vor% Die Einstellung der Komponenten erfolgt einfach durch Aufruf von setEnabled()
auf jedem einzelnen meiner Buttons und Textfelder, was schon bei einer kleinen Anzahl von Komponenten unübersichtlich wird. Meine Maus-Listener haben auch ähnliche Schalter zusätzlich zu den Abfragen isLeftMouseButton()
und isRightMouseButton()
, die das Ganze wirklich verwirrend machen.
Meine Implementierung enthält noch nicht einmal Unterzustände, und obwohl ich es gerade jetzt funktioniere, gibt es bereits eine Inkonsistenz mit der Einstellung des Cursors.
Meine Frage lautet also: Gibt es eine bessere Lösung für die Verwaltung dieser GUI-Zustände und -Unterzustände und für den Status der UI-Komponenten basierend auf Benutzereingaben, insbesondere einer, der mehr Konsistenz erleichtert?
Der beste Weg, dies zu umgehen, ist das State Design Pattern:
Sie verfügen über allgemeine Eingabe-Listener, die die Ausführung von Tasks an Ihre konkreten Zustände delegieren. Der jeweils aktuelle Zustand wird dann auf seine eigene Art und Weise behandelt. Es gibt viele Variationen darüber, wie man das Konzept anwendet. Die Schlüsselidee besteht jedoch darin, dass sich bei einem Wechsel des Anwendungsstatus ein anderes Statusobjekt zum "aktuellen Status" entwickelt und für die Verarbeitung der Eingabe zuständig ist.
Zum Beispiel: Rufen Sie in einer mouseMove()
-Ereignisbehandlungsroutine currentState.mouseMove(evt)
auf und lassen Sie das aktuelle Zustandsobjekt die mouseMove
behandeln, ohne dass Schalteranweisungen erforderlich sind.
Tags und Links java user-interface swing