どのように他のアクションからアクションを呼び出すには? (それがすべてで賢明だ場合)
-
18-09-2019 - |
質問
私は、ActionクラスにActionListenerにを使用してから、Swingアプリケーションをリファクタリングしようと思います。
今私は、基礎となるモデルの状態を扱うし、適切なユーザーダイアログを表示するImportExport
というクラスを持っています。 ImportExport
は機能save()
、saveAs()
とopen()
を持っています。ユーザーが「開く」メニュー項目をクリックすると、アクションリスナーは、open()
を呼び出しモデルは変更がある場合は最初のチェックをopen()
し、その場合は、彼が最初に保存したい場合は、ユーザーを求めるダイアログが表示されます。ユーザーがクリックした場合、今、「はい」open()
は再びいくつかのチェックを実行し、ユーザーのダイアログを表示するsave()
を呼び出します。 save()
はかなり永続的である:このアクションから抜け出すための唯一の方法は、成功した保存やユーザーは、彼がキャンセルしたいことを決定することにより、どちらかです。私は強くsave()
が提供するフィードバックに依存しており、ユーザーがキャンセルしたい場合、私は、呼び出しopen()
機能を解除ます。
私は、三つのクラス(ImportExport
、OpenAction
&SaveAction
)にSaveAsAction
クラスを分割したかったそれらのそれぞれは、AbstractAction
をサブクラス化し、最終的にImportExport
クラスを取り除きます。ユーザーが別のものを開く前に、モデルを保存したい場合、私は実行するためにSaveAction
に伝えるにはどうすればよい:そして、これは私の問題が発生したどこにあるのでしょうか?ユーザーがキャンセルすることを決定した場合、どのようにフィードバックを得るのですか?
これはさえ正しいアプローチですか?私は保存して開いたアクションでコードを重複していて好きではないと私はすでに私の基本的なモデルにできるだけ多くの機能を入れているが、これは何のオプションではありませんので、ユーザーのダイアログが場違いobiouslyです。私はちょうど私のAction
クラスを維持し、単純にすべてのアクションがImportExport
で適切な関数の呼び出し委任機能やsouldのこの種を保持するために、すべてで設計ImportExport
ました。どのようにActions
を使うのですか?
解決
私は時々「コントローラ」アクションを追加します。 OpenAction、SaveActionとSaveAsActionは、このコントローラのアクションをサブクラス化します。コントローラのアクションは、モデルの状態を判断し、適切なとは、正しいサブクラスを呼び出す場合、ユーザからの詳細情報を要求する。
他のヒント
ImportExportController
:私はこれらのメソッドを持つ、open, save, saveAs
クラスを作成します。このコントローラは、ビジネス・ロジックを知っているだろう。
私のAction
クラスは、ビジネスロジックの多くが含まれていません。彼らは唯一のコントローラを呼び出します。
しかし、これらのアクションはすべてのラベル、アイコン、加速器... JButton
に表示されている必要があり、JMenuItem
、などが含まれます。
私にとっては、Actions
は便宜上使用GUI指向クラス、(彼らは非常に便利です!)ですが、何のクラスは、ビジネスロジックを処理するための専用ません。