Swing入門以前 - Swingの概念モデル(3) - layered pane, glass pane
前回の続き。「階層化区画」「コンテンツ区画」「ガラス区画」の上下関係はどうやって決まっているのか。
これについては、JRootPaneのJavadocに解説が記載されていた。Javadocの図の方がわかりやすいかもしれないが、一応オブジェクト図で関係を示す。
コンテンツ区画及びメニューバーは、階層化区画にセットされる。つまり、階層化区画の上に乗っているイメージとなる。以下はJRootPaneのコンストラクタ(前回の記事参照)で実行されているコンテンツ区画に関する処理。太字の部分で、階層化区画へコンテンツ区画をセットしている。(斜体箇所については[補足]参照)
public void setContentPane(Container content) {
if(content == null)
throw new IllegalComponentStateException("contentPane cannot be set to null.");
if(contentPane != null && contentPane.getParent() == layeredPane)
layeredPane.remove(contentPane);
contentPane = content;layeredPane.add(contentPane, JLayeredPane.FRAME_CONTENT_LAYER);
}
次に、階層化区画とガラス区画はどちらもルート区画の子であるにもかかわらず、ガラス区画の方がより上の区画として表現されて理由について。
この上下関係は、JRootPaneクラス中の次のメソッドで表されている。
protected void addImpl(Component comp, Object constraints, int index) {
super.addImpl(comp, constraints, index);
/// We are making sure the glassPane is on top.
if(glassPane != null
&& glassPane.getParent() == this
&& getComponent(0) != glassPane) {
add(glassPane, 0);
}
}
このメソッドは、JRootPaneにコンポーネントを追加するメソッドであるが、太字コメントにある通り、新しいコンポーネントが追加された後、ガラス区画が必ず最前面に来るようにセットしなおしていることがわかる。
以上が、各区画の上下関係について調べた結果である。
[補足]前述コード中の斜体の部分からは、JRootPaneのフィールドにも同じインスタンスをセットしているように見える、つまりオブジェクト図としては下のようになるのが正確なように思えるが、本筋とは関係ないと思われるため、今回考察は省略する。
« Eclipse3.3 JDTが使用しているコンパイラのバージョン確認方法 | トップページ | 910ISとCG6を撮り比べてみた »
この記事へのコメントは終了しました。
« Eclipse3.3 JDTが使用しているコンパイラのバージョン確認方法 | トップページ | 910ISとCG6を撮り比べてみた »
コメント