Sample : JFrameとJDialog

実装サンプル : なし

CAMCのクライアント画面は、Swingの javax.swing.JFrame, javax.swing.JDialogを継承して作成しています。
そのため、JFrame,JDialog の特性をそのまま引き継いでいます。
このドキュメントでは、JFrame,JDialog の特性をまとめ、どのWindowタイプを使用したら よいかの指針になればと思います。

1.CAMC フレームの種類
2.JFrame,JDialog動作概要
3.参考:SwingJFrame,JDialogを使ったテスト結果

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は表示されません。
    ./images/taskbar.jpg
  • 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とで違う。詳しくは 画面タイトルバー表示 を参照してください。

画面の種類を決定する場合には、まずは 画面同士の関連を考察します。
画面同士の関連は以下に分類されます。
./images/frames.jpg

  1. Root画面
    一番最初に起動する画面です。
    この画面は JFrame にすると良いでしょう。
    業務系アプリではこの画面が 「ログイン画面」に当たることが多く、JDialog(Modal)で実装しているパターンもありますが、 Root画面をJDialog(Modal)にすると OSタスクバーにて表示されない などが発生するため、ユーザインターフェース的に 最適 では ありません。 JDialog(Modal)にしている理由として 「タイトルバーに表示されるボタンにて 最大化、最小化 を表示したくない」 なのであれば、 画面タイトルバー表示 を参考に、 タイトルバーを表示させないようにする などの対応をするのも一つの方法です。
  2. 兄弟関係画面
    同レベルに位置する画面で、上図では A画面とB画面 や B1画面とB2画面 の関係になります。
    この場合は、お互いを同じ画面の種類にする 場合が多くなります。
    たとえば、A画面が JFrame であれば、B画面もJFrameにする。
    A画面が JDialog(Modal) であれば、B画面もJDialog(Modal)にする となります。
  3. 親子関係画面
    親子の関係にある画面で、上図では B画面 と B1画面、B2画面 の関係になります。
    親子関係に分類するときのポイントは 「親画面が閉じたとき、子画面を自動的に閉じる」 関係かどうか? になります。 この条件に当てはまらないときには、親子画面ではなく、兄弟画面の方に分類します。
    次のポイントとしては「子画面が表示中に 親画面が操作できるかどうか?」になります。
    操作可能な場合には、子画面はJDialogに、操作不可能な場合には、子画面は JDialog(Modal)にします。

まず 親子関係にある画面かどうか? を判断します。
親子関係にない画面については、基本的には JFrame を使用することになります。

すべてのパターンにて上記の判断になる訳ではなく、制御を組み込むことにより 「JFrame同士でも親子関係のように動かす」 などのようにすることは可能です。
ただし、Owner指定でJDialogを使用すると Swingの仕様である 「親画面が閉じたとき、子画面を自動的に閉じる」 が動作することに 注意してください。

参考:SwingJFrame,JDialogを使ったテスト結果↑top

Swing JFrame,JDialogを使って
A 画面 ⇒ B画面(OwnerはA画面) ⇒ C画面(OwnerはB画面) へと画面遷移した場合 の 画面挙動
のテストを行った結果になります。

./images/window-check.jpg

Valid XHTML 1.1