Mejor enfoque para la acción de dos estados
-
13-09-2019 - |
Pregunta
He implementado recientemente un Action
que alterna el estado de habilitación de una función de negocio. Cada vez que el usuario invoca la acción que establece un indicador booleano: " willEnable " para determinar si la siguiente invocación va a activar o desactivar la función. Del mismo modo se actualiza el nombre de la acción, una breve descripción y el icono para reflejar el nuevo estado. Luego, dentro de mi método actionPerformed(...)
tomo una acción diferente en función del estado de willEnable
.
- ¿Es este el enfoque correcto o lata
Alguien puede recomendar uno mejor (como yo
Sospecho que esto es un problema común)?
(Puedo ver que los actos
JToggleButton
como un botón de dos estados pero quiero esta acción sea visible en unaJMenuBar
así como unJButton
, así que no creo que esto es apropiado).
Editar
En concreto, ¿cómo aplicaciones como idea con este acuerdo? Iban a utilizar las acciones de varios estados (como antes) o iban a intercambiar un diferente Action
en un JButton
dado usando setAction(Action)
? Tal vez este enfoque es mejor?
- Al actualizar las propiedades de una acción
puedo depender de componentes GUI
inicializado con que
Action
(por ejemploJButton
) repintar automáticamente ¿sí mismos? ¿Y si elJButton
cambios de tamaño como resultado? Debería ser revalidar el que contieneJPanel
mismo? - Se cambia el nombre de la acción de una mala
¿cosas que hacer? Esta es la única manera que
puede hacer el cambio de texto JButton, pero soy consciente de que el nombre probablemente debería permanecer constante si la acción está siendo colocado en un
ActionMap
.
Gracias de antemano.
Solución
Yo esperaría que cualquier componente de interfaz gráfica de usuario que se crea con un poco de datos "modelo" (que incluiría un Action
como un modelo de datos) deben registrarse a sí mismo como oyente a ese modelo. Es debe medidas apropiadas, erm, la acción en un PropertyChangeEvent
ser despedido:. Cualquier otra conducta constituiría un error en mi opinión
Lo cuestionable es si es legítimo cambiar el nombre de la acción; Creo que No es legítimo . Su acción es lógicamente ToggleEnabledStatus y eso no cambia porque la acción se ha invocado. Cualquier componente que necesita para mostrar cualquier otro texto debe registrarse a sí mismo como oyente a la Action
y luego comprobar su bandera willEnable
a tomar el caso, erm, la acción.
Alternativamente, usted puede escribir su propia clase que implementa ToggleButtonModel
y Action
al mismo tiempo y controlar los eventos de cambio desde dentro de ella. Se trata de una gran cantidad de código, sin embargo, para tan poco beneficio
Otros consejos
Es posible que desee ver en los href="http://en.wikipedia.org/wiki/State_pattern" Patrón Estado .
Básicamente, se crea una interfaz y dos (o más) de las implementaciones que para cada estado. Como un simple ejemplo, el desactivar el Estado sólo podría implementar la interfaz de no hacer nada mientras que el estado habilitado hace algunas acciones. Para cambiar el estado sólo tendría que hacer
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();
}
Si bien es una pequeña sobrecarga para un solo método, sin duda sueldos de tan pronto como usted tiene varios métodos que cambiar su comportamiento en función de un solo estado.