コンポーネント、ページ と デスクトップ

コンポーネント

コンポーネントはラベル、ボタン、ツリーのようなUIオブジェクトです。それらは視覚的な表現と特定ユーザーインターフェイスの動作を定義します。それらを操作することで、開発者はクライアント側の視覚的なアプリケーションの表し方をコントロールします。

コンポーネントはorg.zkoss.zk.ui.Componentインターフェイスを実装しなければなりません。

ページ

ページ (org.zkoss.zk.ui.Page) はコンポーネントの集合です。それぞれのコンポーネントはブラウザのある部分で表示されています。ZKローダーがZUMLのページを翻訳したときにページは自動的に作成されます。

ページのタイトル

どのページでも、ブラウザウィンドウのキャプションにタイトルを追加できます。詳しくはZKユーザーインターフェースマークアップ言語 の章のプロセス命令セクションを参照してください。

<?page title="My Page Title"?>

デスクトップ

ZUMLページは直接的にまたは間接的にほかのZUMLページを含んでいます。これらのページは同じURLにつながっているので、まとめてデスクトップ(org.zkoss.zk.ui.Desktop)と呼ばれています。つまりデスクトップとは同じURLにつながっているページの集合です。

ZKアプリケーションがユーザーと対話するとき、ページがデスクトップに追加されたり、またいくつかがデスクトップから削除されます。同様に、ページからコンポーネントがつけ足されたり、消されたりします。

createComponents メソッド

ページとデスクトップは自動的に作られたり、消されたりします。それらを消したり作ったりするAPIはありません。ZUMLがページを読み込むたびにページが作成され、ZKがこれ以上参照しないと認識したときにページは削除されます。最初のZUMLページが読み込まれた時にデスクトップは作成され、一つのセッションに対して、デスクトップが多く作られすぎたときに消されます。

org.zkoss.zk.ui.ExecutionsクラスのcreatComponentsメソッドはページではなくてコンポーネントだけ作成します。また、ZUMLファイル(aka.,page)を読み込んだ時も同様です。

コンポーネントの森

一つのコンポーネントは一つ以上の親コンポーネントを持つことができません。一つのコンポーネントには複数の子コンポーネントを持つことがあります。あるコンポーネントは特定の種類のコンポーネントのみを子として受け入れます。また別のコンポーネントは全く子をとりません。たとえば、XUL中のListboxListcolsListite mだけを受け入れます。詳しいことが知りたければ、JavadocまたはXULチュートリアルを参照してください。

親のいないコンポーネントはルートコンポーネントと呼ばれます。一つのページは複数のルートコンポーネントから成り立っていることがあります。なお、ルートコンポーネントはgetRootsメソッドによって検索できます。

コンポーネント:視覚表現とJavaオブジェクト

サーバー中でジャバオブジェクトになる他に、コンポーネントはブラウザ上で視覚要素[20]を担当します。ただし、それはただ一ページのみに属している場合です。コンポーネントがページに添付されているとき、その視覚要素[21]は作成されます。コンポーネントがページから外れるとき、視覚部分はなくなります。

ページにコンポーネントを添付する方法は二つあります。まず一つ目はsetPageメソッドを呼び出して、任意のコンポーネントをそのページのルートコンポーネントにします。二つ目はsetParent, insertBefore, appendChildメソッドを呼び出す方法で、コンポーネントを他に所属している子コンポーネントにすることができます。そして、子コンポーネントは親が属しているページと同じページに属することになります。

同様にして、nullでsetPageを呼び出すことでページからルートコンポーネントを外すことができます。子は親から離れる、または親がページを離れることで外れます。

識別子

どのコンポーネントも識別子(getIdメソッド)を持っています。識別子はコンポーネントが作成されるとき自動的に作成され、開発者はいつでもそれを編集することができます。識別子に名前をつける制限はありません。しかしながら、識別子がアルファベットで指定されたら、ZUMLページに組み込まれているJavaコードとEL表記で直接アクセスすることができます。

<window title="Vote" border="normal">
    Do you like ZK? <label id="label"/>    
    <separator/>    
    <button label="Yes" onClick="label.value = self.label"/>    
    <button label="No" onClick="label.value = self.label"/>    
</window>

UUID

コンポーネントはUUID(Universal Unique ID)という別の識別子を持っていますが、アプリケーション開発者はめったに使用しません。

UUIDはコンポーネントとクライアントエンジンによって使われ、ブラウザ上でDOMを操作したり、サーバーと通信するために使われます。より正しく言うと、クライアント上にあるDOM要素のid属性はUUIDです。

UUIDはコンポーネントが作られるときに自動で作られます。UUIDのうちでHTMLタグを表すコンポーネントの識別子以外は、変えることができません。

HTML関連のコンポーネントはUUIDを他のコンポーネントと異なる方法で処理します。UUIDはIDと同じです。もしHTML関連のコンポーネントのIDを変えてしまったら、UUIDはそれに応じて変わります。この特性によって、古いJavaScriptコードとserveletsは以前のまま使うことができます。



[20] ブラウザがクライアントのであれば、視覚的な表現はDOM要素かその集合です。

[21] ビジュアル部分は自動的に生成・更新・削除されます。開発者はそれを処理する必要はほとんどありません。開発者主なタスクはサーバー側のオブジェクトを処理することです。