2014-12-17 6 views
8

Ich bin auf der Suche nach einem Graphen-Reader-Programm, das jeden gescannten Graphen und konvertieren Sie seine Werte in eine CSV mit wenig Aufwand. Das folgende Diagramm beschreibt die grundlegende Steuerung fließenPflegen und steuern GUI Zustände und Unterzustände

enter image description here

ich einen Prototyp haben und läuft, die meine grundlegenden Anforderungen erfüllt, aber bevor mit Entwicklung fortfahren Ich möchte der beste Weg, wissen, GUI Staaten und substates zu halten . Im Moment bin ich mit einem Enum:

public enum UIState { 
    MAKING_SELECTION, SELECTING_AXIS_POINTS, SETTING_VALUES, SELECTING_GRAPH_POINTS 
} 

Der Controller verfügt über eine UIState, die durch den Aufruf von Tasten und Maus Zuhörer eingestellt werden kann

public void setUiState(UIState uiState) { 
    switch (this.uiState = uiState) { 
     case MAKING_SELECTION: 
      frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); 
      break; 
     case SELECTING_AXIS_POINTS: 
      clearSelection(); 
      frame.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR)); 
      break; 
     case SETTING_VALUES: 
      clearSelection(); 
      break; 
     case SELECTING_GRAPH_POINTS: 
      frame.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR)); 
      clearSelection(); 
      break; 
    } 

    updateView(); //Repaints frame 
    setChanged(); 
    notifyObservers(uiState); 
} 

Mein OptionsPanel, das Panel, das alle Tasten enthält und Eingangs Felder, beobachtet die Steuerung und ruft einen großen Schalter, wenn es ändern beobachtet:

@Override 
public void update(Observable o, Object arg) { 
    if (arg instanceof UIState) { 
     switch ((UIState)arg) { 
      case MAKING_SELECTION: 
       //Set component statuses 
       break; 
      case SELECTING_AXIS_POINTS: 
       //Set component statuses 
       break; 
      case SETTING_VALUES: 
       //Set component statuses 
       break; 
      case SELECTING_GRAPH_POINTS: 
       //Set component statuses 
       break; 
     } 
    } 
} 

die Einstellung der Komponenten wird nur getan, indemAufrufauf jedem einzelnen meiner Buttons und Textfelder, was schon mit einer kleinen Anzahl von Komponenten unklar wird. Meine Maushörer haben auch ähnliche Schalter zusätzlich zu den isLeftMouseButton() und isRightMouseButton() Abfragen, die das Ganze wirklich verwirrend machen.

Meine Implementierung enthält nicht einmal Unterzustände und obwohl ich es irgendwie funktioniert habe, gibt es bereits Inkonsistenz mit der Einstellung des Cursors.

Meine Frage ist also: Gibt es eine bessere Lösung für die Verwaltung dieser GUI-Status und Unterzustände und setzen Sie den UI-Komponentenstatus auf Benutzereingaben, vor allem eine, die mehr Konsistenz erleichtert?

+3

Nizza bearbeiten. Plus one .. –

+5

Vielleicht in das State Design Pattern schauen? http://en.wikipedia.org/wiki/State_pattern –

+0

@MattCoubrough also, wenn ich richtig verstanden habe, würde ich eine Schnittstelle irgendeiner Art haben, die abstrakte Methoden wie 'getCursor()' oder 'changePanelCompStates (OptionPanel-Gremium)' haben würde könnte durch ui State-Klassen implementiert werden. Wie hätte ich allerdings Input-Listener bekommen? Würde jede dieser Zustandsklassen ihre eigenen Listener haben, die zu meinem Panel hinzugefügt oder von diesem entfernt würden, wenn sich der Zustand ändert? – Marv

Antwort

3

Der beste Weg, dies zu handhaben ist, den Staat Design-Muster zu verwenden:

http://en.wikipedia.org/wiki/State_pattern

Sie haben Eingang für allgemeine Zwecke Zuhörer der Delegierten der Aufgabenausführung zu Ihrem konkreten Staaten. 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: in einer mouseMove() Event-Handler-Aufruf currentState.mouseMove(evt) und lassen Sie das aktuelle State-Objekt behandeln die mouseMove ohne Notwendigkeit für Switch-Anweisungen überhaupt.