Sample : JFrameとJDialog
実装サンプル : なし
CAMCのクライアント画面は、Swingの javax.swing.JFrame, javax.swing.JDialogを継承して作成しています。
そのため、JFrame,JDialog の特性をそのまま引き継いでいます。
このドキュメントでは、JFrame,JDialog の特性をまとめ、どのWindowタイプを使用したら
よいかの指針になればと思います。
CAMC フレームの種類↑top
ToolClient:CAMCでの 「フレーム種類」 により、JFrameの継承か、JDialogの継承かが決定します。
種類 | 継承元 |
---|---|
APPLICATION | JFrame |
APPLICATION_QUIT_ON_CLOSE | JFrame |
DIALOG(MODAL) | JDialog |
DIALOG(MODAL)_QUIT_ON_CLOSE | JDialog |
DIALOG | JDialog |
DIALOG_QUIT_ON_CLOSE | JDialog |
CAMC画面のJDialogの継承のものについては、Owner(親画面)が起動元画面として自動的に設定されます。
JFrame,JDialog動作概要↑top
Swing JFrame,JDialogの動き
- OSのタスクバー上には JFrameは表示されるが、JDialogは表示されません。
- Alt+Tab で表示される画面
Alt+Tabで表示される画面切替の表示では、 ”Modal画面” もしくは ”Ownerの指定した親子関係の 最後の子供画面” が表示されます。 - Owner(親画面)を指定できるのはJDialogになります。JFrameでは使用できません。
- JDialog(Modal)の子画面は JDialog(Modal)を使う。
JDialogModal画面表示後に、”Owner指定なし” かつ ”Modalでない 画面を表示” すると 動作不具合が発生します。 - JDialog(Modal)を表示する場合は、Owner(起動元画面)を指定すること。
Owner指定せずに JDialogModal画面を表示すると OSタスクバーをクリックしても 操作可能画面が表示されないため推奨しません。
(Webtribe/VisualFrameのCAMCクライアントでは常にOwner指定ありの状態で動作しています。) - 親画面終了時は 終了親画面をOwner指定した子画面(JDialog)も一緒に画面終了します。
- タイトルバーに表示されるボタン(最大化ボタンや、×ボタンなど)がJFrameとJDialogとで違う。詳しくは 画面タイトルバー表示 を参照してください。
画面の種類を決定する場合には、まずは 画面同士の関連を考察します。
画面同士の関連は以下に分類されます。
- Root画面
一番最初に起動する画面です。
この画面は JFrame にすると良いでしょう。
業務系アプリではこの画面が 「ログイン画面」に当たることが多く、JDialog(Modal)で実装しているパターンもありますが、 Root画面をJDialog(Modal)にすると OSタスクバーにて表示されない などが発生するため、ユーザインターフェース的に 最適 では ありません。 JDialog(Modal)にしている理由として 「タイトルバーに表示されるボタンにて 最大化、最小化 を表示したくない」 なのであれば、 画面タイトルバー表示 を参考に、 タイトルバーを表示させないようにする などの対応をするのも一つの方法です。 - 兄弟関係画面
同レベルに位置する画面で、上図では A画面とB画面 や B1画面とB2画面 の関係になります。
この場合は、お互いを同じ画面の種類にする 場合が多くなります。
たとえば、A画面が JFrame であれば、B画面もJFrameにする。
A画面が JDialog(Modal) であれば、B画面もJDialog(Modal)にする となります。 - 親子関係画面
親子の関係にある画面で、上図では B画面 と B1画面、B2画面 の関係になります。
親子関係に分類するときのポイントは 「親画面が閉じたとき、子画面を自動的に閉じる」 関係かどうか? になります。 この条件に当てはまらないときには、親子画面ではなく、兄弟画面の方に分類します。
次のポイントとしては「子画面が表示中に 親画面が操作できるかどうか?」になります。
操作可能な場合には、子画面はJDialogに、操作不可能な場合には、子画面は JDialog(Modal)にします。
まず 親子関係にある画面かどうか? を判断します。
親子関係にない画面については、基本的には JFrame を使用することになります。
すべてのパターンにて上記の判断になる訳ではなく、制御を組み込むことにより 「JFrame同士でも親子関係のように動かす」
などのようにすることは可能です。
ただし、Owner指定でJDialogを使用すると Swingの仕様である 「親画面が閉じたとき、子画面を自動的に閉じる」 が動作することに
注意してください。
参考:SwingJFrame,JDialogを使ったテスト結果↑top
Swing JFrame,JDialogを使って
A 画面 ⇒ B画面(OwnerはA画面) ⇒ C画面(OwnerはB画面) へと画面遷移した場合 の 画面挙動
のテストを行った結果になります。
