0

私の最初の問題は次のとおりです。「同じアクションが、別の Swingオブジェクトで参照される別の UI コンポーネントと組み合わせて使用​​される場合、Swing の量をActions(他のアクションのベースとして使用して) どのように制限するのですか?相互に直接参照"?AbstractActionJPanel

私の 2 番目の問題は、「アクションの actionPerformerd() メソッドが 2 つ以上の異なる UI コンポーネント参照を使用する場合に、アクションと UI コンポーネントの間で参照を維持する方法」です。直接関係のないさまざまな場所で actionPerformed() メソッド内に ui コンテキストが必要です (まあ、少なくともそれは私が思うことです)。

私が扱っている私の設計上の懸念を説明させてください...

すべての UI ロジックを保持する JFrame が 1 つあります。この JFrame は、JPanel ロジックへの 3 つの異なる参照を保持します: a ControlPanel、 a 、MainPanelおよび a StatusPanel(すべて JPanel を拡張します)。

ControlPanelJMenu と項目、JToolBar 項目、およびこの JPanel をセットアップし、すべての適切なアクションがインストールされた状態で contentpane に追加されます。

MainPanel、ユーザーとの実際のコミュニケーションが行われる場所です。この JPanel は、内部に多数の JPanel を含む CardLayout を保持します。

これStatusPanelは実際には、さまざまな JPanel からのあらゆる種類のテキスト メッセージを処理するステータスバーですが、StatusBarManager オブジェクトによって処理されます。ここには空想的なものはありません。退屈な GUI のものだけです。

ここで問題の部分: 最初に、考えられるアクションごとに一連の拡張AbstractActionsをプログラムしました (あまり良いアイデアではありません)。次に、特定のタスクに obj を ActionFactory渡すan をプログラムしました。次のようにします。メソッドの実装という 1 つの違いだけで、すべての「ファイル」操作 のオブジェクトをインスタンス化できるため、これはより良いアプローチのように思えます。別のものを呼び出すと、以前にインスタンス化された同じオブジェクトが返されるため、これは良い考えのようです (多くの重複オブジェクトを保存します)。これは良い考えに思えるかもしれませんが、私はまだ のコンテキストに苦労しています。とを使用して表示する「カード」を選択すると、ActionActionFactory.getAction("file.new");FileActionactionPerformed()JPanelActionFactory.getAction("file.new");ActionJPanelsMainPanelJMenuJMenuItems、私はControlPanelUIコンテキストのみにいて、メソッドにはそのJPanelのを使用して「カード」を設定するコンテキストactionPerformed()がありません。同じことが MainPanel にいて (ボタンを押して)、StatusPanel のコンテキストがない場合にも当てはまります。MainPanelCardLayout

これらの以前の提案をstackoveflowで見ましたが、どういうわけか接続できません。私は手がかりを失っています...

SO でのアクションに関する同じ Q&A の並べ替え: herehereherehereherehereherehere、およびhere

これには、appframework、eclipse rcp、spring rcp などのフレームワークを使用することを提案する人もいます。しかし、デフォルトの JVM 6 で利用できるもの以外のいくつかの理由から、私はフレームワークをまったく使用しないことを好みます。

誰かがこの問題に光を当てて、私の問題の良い解決策を見つけるのに役立つことを願っています. 事前にご協力いただきありがとうございます。

4

1 に答える 1

3

あなたが説明したデザインの主な欠陥は、アクションがモデル/コントローラーではなく、UI に対して直接機能することだと思います。

アクションがモデルを更新するだけで、各ビュー パーツがモデルの関連部分と同期している場合、1 つのアクションと他のいくつかのビュー コンポーネントとの間の依存関係を回避できます。

これにより、共通のロジックを共有することもできます。そのロジックをアクションからモデル/コントローラーに移動すると、アクションは基本的にワンライナーになります (そのロジックを呼び出します)。

于 2012-07-26T12:43:08.487 に答える