Pflegen und kontrollieren GUI Zustände und Unterzustände

8

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

gesetzt werden kann %Vor%

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?

    
Marv 17.12.2014, 00:32
quelle

1 Antwort

3

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.

    
Tim B 28.04.2015, 18:03
quelle

Tags und Links