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.

  1. ¿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 una JMenuBar así como un JButton, 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?

  1. Al actualizar las propiedades de una acción puedo depender de componentes GUI inicializado con que Action (por ejemplo JButton) repintar automáticamente ¿sí mismos? ¿Y si el JButton cambios de tamaño como resultado? Debería ser revalidar el que contiene JPanel mismo?
  2. 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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top