2

Swing プロジェクトで を使用し、メニュー ペインコンテキスト ペインステータス ペインJFrameの 3 つの部分に分割しました。

ステータス ペインには、ユーザーがアクションを実行する際に、アクションが成功したかどうかと、ユーザーが知りたいその他の情報が表示されます。たとえば、ユーザーがコンテキスト メニューの削除ボタンをクリックすると、操作が正常に完了したかどうかがステータス パネルに示されます。

ステータス パネルの問題は、しばらくするとステータスを更新する必要があることです。たとえば、ユーザーが別のボタンをクリックしたり、コンテキスト ペインの他のページを移動したりした場合、ステータス ペインには最後の削除操作の結果が表示されたままになってはなりません。

これには、私が考えることができる2つの回避策があります。

  1. 数秒後にステータスをクリアします。
  2. JPanelsすべてのコンポーネント ( 、 、および ...)にマウスまたはキーボード アクション リスナーを追加して、マウスまたはキーボードJTextFieldsからのアクティビティ時にステータス パネルを呼び出してステータスをクリアします。

最初のオプションの実装は比較的簡単ですが、それだけでは十分ではありません。2つの組み合わせが必要だと思います。ただし、問題は、これらのアクション リスナーをすべてのコンポーネントに追加する場合、非常に汚いアプローチになることです。たぶんメインフレームに追加できます。私はしました(コードは以下に示されています)が、マウスがフレーム自体のパネル上で移動している場合にのみ機能します(たとえば、コンテキストペインではありません)

何か提案はありますか?

    JFrame.this.addMouseMotionListener(new MouseMotionListener() {

        @Override
        public void mouseDragged(MouseEvent me) {
        }

        @Override
        public void mouseMoved(MouseEvent me) {
            Config.statusPanel.clearStatus();
        }
    });
4

1 に答える 1

2

いいえ、これに MouseListener を使用するのはちょっとクレイジーです。あなた自身は、それは汚い解決策だと言っています。代わりに、PropertyChangeListener を使用してクラス (ほとんどの場合 Model クラス) の状態をリッスンし、ビュー クラスはリッスンしない方がはるかに優れていると思います。

たとえば、ユーザーが JButton (ビュー クラス内のコンポーネント) を押すと、コントロール クラスはこのボタンのプッシュに反応し、モデルにその状態を変更するように指示します。ステータス ペインの PropertyChangeListener は、モデルの状態の変化に応答し、独自のビューを更新します。これは、この問題を解決する最もクリーンな OOP の方法です。

これがうまく機能するためには、プログラムはモデル-ビュー-コントローラー パターンの変形の 1 つに基づいている必要がありますが、とにかくこれを行う必要があります。

于 2012-05-12T19:58:33.190 に答える