シンプルなビジュアルコンポーネントは、既存の Flex コンポーネントのサブクラスで、スキンやスタイルを使用してコンポーネントの外観を変更したり、コンポーネントに新しい機能を追加したりします。例えば、新しいイベントタイプを Button コントロールに追加したり、DataGrid コントロールのデフォルトのスタイルやスキンを変更したりできます。詳しくは、ActionScript のシンプルなビジュアルコンポーネントを参照してください。
高度なコンポーネントでは、一般的に次の処理を行います。
通常は、コンポーネントを、既存のクラスのサブクラスとして作成します。例えば、Button コントロールに基づくコンポーネントを作成する場合は mx.controls.Button クラスのサブクラスを作成します。ユーザー独自のコンポーネントを作成するには、mx.core.UIComponent クラスのサブクラスを作成します。
すべての Flex ビジュアルコンポーネントは、UIComponent クラスのサブクラスです。したがって、ビジュアルコンポーネントは、UIComponent クラスで定義されたメソッド、プロパティ、イベント、スタイル、エフェクトを継承します。
高度なビジュアルコンポーネントを作成するには、クラスコンストラクタを実装する必要があります。また、UIComponent クラスについて、次の保護されたメソッドをオーバーライドすることもできます。
|
UIComponent メソッド |
説明 |
|---|---|
| commitProperties() |
コンポーネントのプロパティに対する変更を調整して、変更を同時に実行するか、プロパティが特定の順序で設定されるようにします。 詳しくは、commitProperties() メソッドの実装を参照してください。 |
| createChildren() |
コンポーネントの子コンポーネントを作成します。例えば、ComboBox コントロールは、TextInput コントロールと Button コントロールを子コンポーネントとして含みます。 詳しくは、createChildren() メソッドの実装を参照してください。 |
| layoutChrome() |
Container クラスのサブクラスにおけるコンテナ周囲の境界線領域を定義します。 詳しくは、layoutChrome() メソッドの実装を参照してください。 |
| measure() |
コンポーネントのデフォルトサイズとデフォルト最小サイズを設定します。 詳しくは、measure() メソッドの実装を参照してください。 |
| updateDisplayList() |
これまでのすべてのプロパティとスタイルの設定に基づいて、画面上でのコンポーネントの子のサイズと位置を設定します。また、コンポーネントが使用するスキンやグラフィックエレメントを描画します。コンポーネントの親コンテナは、コンポーネント自体のサイズを決定します。 詳しくは、updateDisplayList() メソッドの実装を参照してください。 |
これらのメソッドは、コンポーネントのユーザーが直接呼び出すのではなく、コンポーネント作成の初期化プロセスの一部として、または、他のメソッドの呼び出しがあった場合に、Flex によって呼び出されます。詳しくは、コンポーネントのインスタンス化ライフサイクルについてを参照してください。
コンポーネントのライフタイムの期間、アプリケーションは、例えば、サイズと位置の変更、表示をコントロールするプロパティの変更、コンポーネントのスタイルやスキンのプロパティの変更などを行ってコンポーネントを変更します。例えば、コンポーネント内で表示されるテキストのフォントサイズを変更します。フォントサイズの変更の一部として、コンポーネントのサイズも変化するので、Flex でアプリケーションのレイアウトを更新する必要があります。レイアウト操作では、Flex が、コンポーネントの commitProperties()、measure()、layoutChrome() および updateDisplayList() メソッドを呼び出す必要があります。
アプリケーションは、プログラムによって、コンポーネントのフォントサイズを変更できます。この変更は、Flex がアプリケーションのレイアウトを更新するのに比べて非常に高速です。したがって、フォントサイズの値を最終的に決定してからレイアウトを更新する必要があります。
別の例を考えてみましょう。Button コントロールの label と icon プロパティなど、コンポーネントの複数のプロパティを設定する場合、すべてのプロパティを設定してから、commitProperties()、measure()、updateDisplayList() のメソッドを一度だけ実行するとします。これらのメソッドについては、label プロパティを設定するときに実行して、icon プロパティを設定するときに再度実行する必要はありません。
また、いくつかのコンポーネントは、同時にフォントサイズを変更する場合があります。各コンポーネントがフォントサイズを変更した後にアプリケーションのレイアウトを更新するのでなく、Flex にレイアウト操作を調整させて、不要な処理を省くことができます。
Flex は、無効化メカニズムを使用して、コンポーネントの変更の同期をとります。Flex は、無効化メカニズムを、一連のメソッドとして実装しています。ユーザーはこれを呼び出すことで、Flex に対して、コンポーネントが変更されて、コンポーネントの commitProperties()、measure()、layoutChrome()、updateDisplayList() のメソッドを呼び出す必要があることを通知します。
無効化メソッドについて、次の表で説明します。
|
無効化メソッド |
説明 |
|---|---|
| invalidateProperties() |
次の画面更新時に commitProperties() メソッドが呼び出されるように、コンポーネントをマークします。 |
| invalidateSize() |
次の画面更新時に measure() メソッドが呼び出されるように、コンポーネントをマークします。 |
| invalidateDisplayList() |
次の画面更新時に layoutChrome() メソッドと updateDisplayList() メソッドが呼び出されるように、コンポーネントをマークします。 |
コンポーネントは、無効化メソッドを呼び出すときに、コンポーネントを更新する必要があることを Flex に通知します。複数のコンポーネントが無効化メソッドを呼び出した場合は、Flex が調整を行い、次回の画面更新時に、まとめて更新が行われるようにします。
通常は、無効化メソッドは、コンポーネントのユーザーが直接呼び出すものではありません。代わりに、コンポーネントの setter メソッドや、必要に応じてコンポーネントクラスの他のメソッドが呼び出します。詳細および使用例については、commitProperties() メソッドの実装を参照してください。
コンポーネントインスタンス化ライフサイクルは、コンポーネントクラスからコンポーネントオブジェクトを作成するときに生じる一連の手順を記述したものです。Flex は、このライフサイクルの一環として、コンポーネントメソッドの呼び出し、イベントの送出、およびコンポーネントの可視化を自動的に行います。
次の例では、ActionScript で Button コントロールが作成され、コンテナに追加されます。
// Create a Box container. var boxContainer:Box = new Box(); // Configure the Box container. // Create a Button control. var b:Button = new Button() // Configure the button control. b.label = "Submit"; ... // Add the Button control to the Box container. boxContainer.addChild(b);
次の手順は、このコードを実行して Button コントロールを作成し、それを Box コンテナに追加したときに何が行われるかを示したものです。
// Create a Button control. var b:Button = new Button()
// Configure the button control. b.label = "Submit";
コンポーネントの setter メソッドは、invalidateProperties()、invalidateSize()、invalidateDisplayList() のいずれかのメソッドを呼び出す場合があります。
// Add the Button control to the Box container. boxContainer.addChild(b);
Flex によって次の処理が行われます。
唯一の例外は、ユーザーがコンポーネントの高さと幅を設定する場合で、Flex は measure() メソッドを呼び出しません。
コンポーネントの設定作業のほとんどは、addChild() メソッドを使用してコンポーネントをコンテナに追加するときに発生します。その理由は、コンポーネントをコンテナに追加するまで、Flex はサイズの決定、継承スタイルのプロパティの設定、画面上での描画ができないからです。
次の例に示すように、アプリケーションを MXML で定義することもできます。
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Box>
<mx:Button label="Submit"/>
</mx:Box>
</mx:Application>
コンポーネントを MXML で作成するときに Flex が実行する一連の手順は、ActionScript で説明した手順と同様です。
コンポーネントをコンテナから削除するには、removeChild() メソッドを使用します。コンポーネントに対する参照がない場合は、最終的に、Adobe® Flash® Player または Adobe® Flash® Player または Adobe® AIR™ のガベージコレクションメカニズムによってメモリから削除されます。
コンポーネントを実装する場合、コンポーネントのメソッドのオーバーライド、新しいプロパティの定義、新しいイベントの送出、アプリケーションに必要な様々なカスタマイズなどを行います。
コンポーネントを実装する一般的な手順は、次のとおりです。
MXML タグプロパティおよびグラフィックファイルとスキンファイルの埋め込みについて詳しくは、ActionScript のシンプルなビジュアルコンポーネントを参照してください。
新しいコンポーネントを定義するのに、すべてのコンポーネントメソッドをオーバーライドする必要はありません。コンポーネントの機能を実装するのに必要なメソッドをオーバーライドするだけでかまいません。Button コントロールや VBox コンテナなど、既存のコンポーネントのサブクラスを作成する場合は、新しい機能をコンポーネントに追加するのに必要なメソッドを実装する必要があります。
例えば、デフォルトのサイズを定義する新しいメカニズムを使用したカスタム Button コントロールを実装するとします。この場合、measure() メソッドをオーバーライドするだけでかまいません。例については、measure() メソッドの実装を参照してください。
別の例として、VBox コンテナの新しいサブクラスを実装する場合を考えてみます。新しいサブクラスは、VBox クラスの既存のサイズ変更ロジックのすべてを使用する一方、クラスのレイアウトロジックを変更して、コンテナの(上から下へではなく)下から上へ、コンテナの子をレイアウトするとします。この場合、updateDisplayList() メソッドをオーバーライドするだけでかまいません。例については、updateDisplayList() メソッドの実装を参照してください。
Flex は、様々なインターフェイスを使用して、コンポーネントの基本機能を個々のエレメントに分割して、1 つずつ実装できるようにしています。例えば、コンポーネントをフォーカス可能にするには、IFocusable インターフェイスを実装する必要があります。また、レイアウトプロセスに利用できるようにするには、ILayoutClient インターフェイスを実装する必要があります。
インターフェイスを簡単に使用できるように、UIComponent クラスは、次の表で定義されたすべてのインターフェイスを実装しています。ただし、IFocusManagerComponent インターフェイスと IToolTipManagerClient インターフェイスは除きます。ただし、UIComponent のサブクラスの多くは、IFocusManagerComponent インターフェイスと IToolTipManagerClient インターフェイスを実装しています。
したがって、UIComponent のクラスやサブクラスについて、サブクラスを作成する場合は、これらのインターフェイスを実装する必要はありません。しかし、UIComponent のサブクラス以外のコンポーネントを作成して、そのコンポーネントを Flex で使用する場合は、これらのインターフェイスを実装することが必要になる場合があります。
Flex コンポーネントが実装する主なインターフェイスを、次の表にまとめます。
|
インターフェイス |
用途 |
|---|---|
|
コンテナ内の子の数を示します。 |
|
|
コンポーネントやオブジェクトが遅延インスタンス化を実現できることを示します。 |
|
|
スキンエレメントのインターフェイスを指定します。 |
|
|
コンポーネントやオブジェクトがフォーカス可能であることを示します。つまり、コンポーネントが FocusManager からフォーカスを取得できるということです。 UIComponent クラスは、IFocusable を実装していません。これは、コンポーネントによっては、フォーカスを取得するように設計されていないからです。 |
|
|
コンポーネントやオブジェクトが、無効化メカニズムを使用して、プロパティの処理、測定、描画やレイアウトの操作を、即座にではなく遅延させて実行できることを示します。 |
|
|
コンポーネントやオブジェクトが LayoutManager の処理、測定、更新のシーケンスに利用できることを示します。 |
|
|
コンポーネントが特化された形のイベント通知をサポートしていることを示します。 |
|
|
コンポーネントやオブジェクトが Repeater クラスで使用できることを示します。 |
|
|
コンポーネントが他のオブジェクトからのスタイルを継承でき、setStyle() メソッドと getStyle() メソッドをサポートしていることを示します。 |
|
|
コンポーネントに toolTip プロパティがあり、ToolTipManager によって監視されることを示しています。 |
|
|
レイアウトコンテナやリストの子となるようにユーザーが実装する必要がある API の基本セットを定義します。 |
|
|
コンポーネントが検証イベントを受け取ることができ、赤い境界線やエラーメッセージのツールヒントなどの検証状態を表示できることを示します。 |
このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート