Frage

Ich habe vor kurzem implementiert eine Action, die den aktivierten Status einer Business-Funktion schaltet. Jedes Mal, wenn der Benutzer die Aktion aufruft, setze ich ein boolesches Flag: „ willEnable “, um zu bestimmen, ob der nächste Aufruf ermöglichen wird, oder die Funktion deaktivieren. Ebenso aktualisiere ich den Namen der Aktion, eine kurze Beschreibung und Symbol, um den neuen Zustand zu reflektieren. Dann in meiner actionPerformed(...) Methode nehme ich eine andere Aktion basierend auf dem Zustand von willEnable.

  1. Ist das der richtige Ansatz oder können jeder empfehlen, einen besseren (wie ich vermuten, dass dies ist ein häufiges Problem)? (Ich kann die JToggleButton Tat sehen als Zwei-Staaten-Taste, aber ich will diese Aktion sichtbar sein auf einem JMenuBar sowie eine JButton, so glaube nicht, das ist falls).

Bearbeiten

Im Einzelnen, wie zu tun Anwendungen wie IDEA damit um? Würden sie verwenden, um Aktionen mit mehreren Zuständen (wie oben) oder würden sie tauschen ein verschiedene Action in eine gegebene JButton mit setAction(Action)? Vielleicht ist dieser Ansatz besser?

  1. Wenn eine Aktion der Aktualisierung Eigenschaften kann ich vertrauen auf GUI-Komponenten mit diesen Action initialisiert (z.B. JButton) automatisch neu zu streichen sich? Was passiert, wenn die JButton Größenänderungen als Ergebnis? Sollte ich sein erneutes Validieren der umschließende JPanel mich?
  2. Ändert sich der Name der Aktion eine schlechte etwas zu tun? Dies ist die einzige Art, wie ich kann die JButton Text ändern, aber ist concious, dass der Name wahrscheinlich konstant bleiben soll, wenn die Aktion in einem ActionMap platziert wird.

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Ich würde erwarten, dass jede GUI-Komponente, die mit einigen Daten „Modell“ erstellt wird (ich würde ein Action als Datenmodell enthalten) sollte sich auf dieses Modell als Zuhörer registrieren. Es muss geeignete, erm, Aktion auf einem PropertyChangeEvent gefeuert. Jedes andere Verhalten einen Fehler meiner Meinung nach bedeuten würde

Die fragwürdige Sache ist, ob es legitim ist, den Namen der Aktion zu ändern; Ich denke, dass es ist nicht legitim . Ihre Aktion logisch ist ToggleEnabledStatus und das ändert sich nicht, da die Aktion aufgerufen wurde. Jede Komponente, die andere Text angezeigt werden muss, sollte sich an die Action als Zuhörer registrieren und dann überprüfen Sie Ihre willEnable Flagge nehmen Sie die entsprechenden, erm, Aktion.

Alternativ können Sie Ihre eigene Klasse schreiben, die ToggleButtonModel und Action zugleich implementiert und gesteuert, um die Änderungsereignisse aus ihm. Dies ist eine Menge Code, aber für so wenig Nutzen

Andere Tipps

Sie können sich die State-Muster suchen.

Grundsätzlich Sie eine Schnittstelle und zwei (oder mehr) Implementierungen es für jeden Staat schaffen. Als einfaches Beispiel kann der Sperrzustand implementieren nur die Schnittstelle nichts, während der aktivierten Zustand hat einige Aktionen zu tun. Um Zustand zu wechseln würden Sie tun einfach

interface IState {
  void doAction();
  boolean isEnabled();
}

class EnabledState implement IState {
  void doAction() {
    setState(new DisabledState());
    // do something
  }
  boolean isEnabled() {return true;}
}

class DisabledState implement IState {
  void doAction() {
    setState(new EnabledState());
    // do nothing
  }
  boolean isEnabled() {return false;}
}

private IState state = new DisabledState(); // default is disabled
private PropertyChangeSupport support = new PropertyChangeSupport(this);

void setState(IState state) {
  if (this.state != state) {
    IState oldState = this.state;
    this.state = state;
    support.firePropertyChange("enabled", oldState.isEnabled(), state.isEnabled());
  }
}

void doAction() {
  state.doAction();
}

Es ist zwar ein wenig Aufwand für eine einzige Methode ist, lohnt es sich auf jeden Fall so bald wie Sie verschiedene Methoden, die es Verhalten auf einem einzelnen Zustand abhängig ändern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top