3

私は最近Action、ビジネス機能の有効ステータスを切り替える を実装しました。ユーザーがアクションを呼び出すたびに、ブール値フラグ「willEnable」を設定して、次の呼び出しで機能を有効にするか無効にするかを決定します。同様に、アクション名、簡単な説明、およびアイコンを更新して、新しい状態を反映させます。次に、actionPerformed(...)メソッド内で、の状態に基づいて別のアクションを実行しwillEnableます。

  1. これは正しいアプローチですか、それともより良いアプローチを推奨できますか (これはよくある問題だと思います)。JToggleButton(これは2 状態ボタンとして機能する ことがわかりますが、このアクションをJMenuBarだけでなくにも表示したいJButtonので、これは適切ではないと思います)。

編集

具体的には、IDEA のようなアプリケーションはこれにどのように対処しますか? 彼らは(上記のように)複数状態のアクションを使用しますか、それとも異なるものActionを特定のJButtonusingに交換しsetAction(Action)ますか?おそらく、このアプローチの方が優れていますか?

  1. Actionアクションのプロパティを更新するとき、それで初期化された GUI コンポーネント(たとえば JButton) を自動的に再描画することに依存できますか? JButton その結果、サイズが変更された場合はどうなりますか? 自分で収容を再検証する必要があり JPanelますか?
  2. アクションの名前を変更するのは悪いことですか? これが JButton テキストを変更できる唯一の方法ですが、アクションがActionMap.

前もって感謝します。

4

2 に答える 2

3

State Patternを見たいと思うかもしれません。

基本的に、状態ごとに 1 つのインターフェイスとその 2 つ (またはそれ以上) の実装を作成します。簡単な例として、無効状態は何もしないようにインターフェースを実装するだけで、有効状態はいくつかのアクションを実行します。状態を切り替えるには、次のようにします

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();
}

単一のメソッドのオーバーヘッドはわずかですが、単一の状態に応じて動作を変更する複数のメソッドを使用するとすぐに、確実に報われます。

于 2009-11-03T13:27:47.483 に答える
2

何らかのデータ「モデル」(データモデルとして含める)で作成されたGUIコンポーネントは、Actionそのモデルのリスナーとして登録する必要があります。解雇された場合は、適切なアクションを実行する必要があります。それ以外の動作は、私の意見ではバグを構成しますPropertyChangeEvent

ここで疑わしいのは、アクションの名前を変更することが正当かどうかです。合法ではないと思います。アクションは論理的にToggleEnabledStatusであり、アクションが呼び出されたため変更されません。他のテキストを表示する必要があるコンポーネントは、それ自体をリスナーとして登録しAction、フラグをチェックwillEnableして適切なアクションを実行する必要があります。

または、変更イベントを実装するToggleButtonModelAction同時にその中から変更イベントを制御する独自のクラスを作成することもできます。これは多くのコードですが、メリットはほとんどありません

于 2009-11-03T13:36:22.943 に答える