Bester Ansatz für Dual-State-Aktion
-
13-09-2019 - |
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
.
- 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 einemJMenuBar
sowie eineJButton
, 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?
- 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 dieJButton
Größenänderungen als Ergebnis? Sollte ich sein erneutes Validieren der umschließendeJPanel
mich? - Ä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.
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.