はじめに
このチュートリアルでは、ユーザーがMacromedia Flexアプリケーションに入力したデータを取得、および保存するためのデータモデルを作成します。また、ここではアプリケーション内のデータを操作する方法にも触れ、フォームから受け取ったデータから新しいオブジェクトを作成する方法や、データグリッド間におけるドラッグ&ドロップの実装方法についても解説します。
なお、このチュートリアルはMacromediaカスタマートレーニンググループに所属する、Robert Crooksが執筆した4部構成のチュートリアルのパート4です。
4部構成の最後のチュートリアルは、ここまでに解説していないFlexクラスライブラリのその他の要素や、ドラッグ&ドロップ可能なインターフェイスの実装といったテクニックなどの紹介を目的としています。また、このチュートリアルでは、Flexを利用して、アプリケーションの「ビュー」、「データモデル」、「コントローラー」をより明確に分離させる手法についても触れていきます。
「ビュー」、「データモデル」、「コントローラー」を明確に分離すれば、例えば、コントローラーのメソッドはビューの詳細を知る必要がありません。また、新しい従業員を追加するためのメソッドは、データをモデルから取得するだけで良く、データがどのようにしてモデルに入れられたかを知る必要がありません。さらに、ドラッグ&ドロップ操作を処理するメソッドは、Flexが生成するイベントオブジェクトのメソッドならびにプロパティとFlex内蔵のDragManager
クラスをもとに機能するので、メソッド自体がデータオブジェクトがどこからドラッグされ、どこにドロップされたかを知る必要はありません。アイテムをドラッグできるようにするには、単にターゲットとなるデータグリッドに「dragEnabled="true"
」属性を追加するだけで済み、コントローラーのメソッドを編集する必要はありません。
本チュートリアルの内容
Application
タグの使い方Panel
コンテナの使い方HBox
の使い方VBox
の使い方Form
コンテナの使い方TextInput
コントロールの使い方Button
コントロールの使い方DataGrid
コントロールの使い方- データのインポートやユーザーが入力した情報の収集のための
Model
クラスの使い方 DataGrid
内のアイテムをドラッグ&ドロップできるようにする方法- ドラッグ&ドロップ操作のためのActionScriptイベントハンドラの作り方
この記事に必要なもの
このチュートリアルをフォローするには、つぎに挙げるソフトウェアやファイルをインストールする必要があります。
Macromedia Flex
Flexのトライアル版に関する詳細については、Flex FAQを参照してください。また、トライアル版の入手方法については、こちらを参照してください。
テキストエディタ
Flex Builder、もしくはDreamweaver MX 2004、あるいはXMLとActionScriptのコードが記述できるコードエディタ(Notepadのような簡単なテキストエディタでも可)が必要です。なおFlex BuilderはFlexサーバーとともにダウンロードできます。また、Dreamweaver MX 2004のトライアル版の入手方法については、こちらを参照してください。
このチュートリアルのためのソリューションファイル
data_model.zip(ZIPファイル)には、このチュートリアルで作成するdata.mxml、Employee.as、DataController.as、employees.xml、locations.xmlの完成版のソースコードが収録されています。これらのファイルは、「flex_tutorials」ディレクトリに保存しておきます。
この記事のために必要な予備知識
- 「Flexの概要の紹介」を読み終えていること
- Flexアプリケーションのブラウズ方法を把握していること
- つぎに挙げるチュートリアルを済ませていること
- このチュートリアルのパート1からパート3までを済ませていない場合は、チュートリアル用のコードファイルを保存するために、Flexのコンテキストルート内に「flex_tutorials」ディレクトリを作成しておきます。
アプリケーションの作成
ここで作成するアプリケーションのビューには、3つのパネルがあり、1つ目のパネルには、従業員の名前と勤務地を表示するDataGrid
コンポーネントと、新たな従業員を追加するための簡単なフォームを配置します。残りの2つのパネルには、エンジニアリンググループとサポートグループのためのデータグリッドをそれぞれ配置します。また、このアプリケーションには、ドラッグ&ドロップ機能を実装し、従業員情報を全従業員用のデータグリッドから、エンジニアリンググループ用やサポートグループ用のデータグリッドにドラッグ操作で追加できるようにします。
ここでは、従業員名と勤務地の既存情報をXMLファイルからインポートするために複数のデータモデルを利用し、全従業員リストに新規従業員追加フォームから収集したデータを追加するために、もう1つのデータモデルを利用します。
また、ActionScriptファイルを2つ作成し、アプリケーション内のイベントを処理するためのメソッドをDataController
クラスに記述します。このコントローラーは、別途のEmployee
クラスを利用して、新規従業員用のデータオブジェクトを生成します。
Applicationオブジェクトの作成
Flexアプリケーションの開発は、まずXMLの宣言とApplication
タグを記述することから始まります。Application
タグの中には、つぎに示すMXクラスライブラリの名前空間宣言を記述します。
xmlns:mx="http://www.macromedia.com/2003/mxml"
なお、接頭辞のmx
はこのライブラリのすべてのタグに対して使用します。
- 新規ファイルを作成し、このファイルを「flex_tutorials」ディレクトリの中に「data.mxml」として保存します。
- ファイルの最初に、つぎのXML宣言を追加します。
- XML宣言のつぎに、MXML名前空間の指定の入った
Application
タグを追加します。
<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml"> </mx:Application>
アプリケーションのレイアウトの作成
アプリケーションのレイアウトは、「Flex基礎講座(パート3):コンテナの利用」にて解説した、「コンテナ」を利用して作成します。ここでは、数あるコンテナの中でHBox
、VBox
、Panel
、Form
を利用して、フォームの備わったメインパネルと、メインパネルの横の2つのサブパネルから構成されるレイアウトを作成します。
Application
ブロックの中に、プロパティ設定のないHBox
コンテナを追加します。HBox
コンテナの中にPanel
コンテナを追加し、各プロパティを次のように設定します。
<mx:HBox></mx:HBox>
<mx:Panel id="empPanel" title="Employee Data"
height="{engPanel.height+supPanel.height}"> </mx:Panel>
Panel
コンテナの中に、プロパティ設定のないForm
コンテナを追加します。Panel
コンテナ内のForm
コンテナの後に、プロパティ設定のないControlBar
コンテナを追加します。Panel
コンテナの後に、プロパティ設定のないVBox
コンテナを追加します。VBox
コンテナの中に新たなPanel
コンテナを追加し、各プロパティを次のように設定します。VBox
コンテナ内に作成したEngineeringGroup
用のパネルの後に新たなPanel
コンテナを追加し、各プロパティを次のように設定します。
<mx:Form> </mx:Form>
<mx:ControlBar> </mx:ControlBar>
<mx:VBox> </mx:VBox>
<mx:Panel id="engPanel" title="Engineering Group"
width="{empPanel.width}"> </mx:Panel>
<mx:Panel id="supPanel" title="Support Group"
width="{empPanel.width}"> </mx:Panel>
Formコントロールの追加
Form
コンテナとそれに関連するコンテナについては、「Flex基礎講座(パート3):コンテナの利用」にて解説しましたが、ここでは新規従業員のデータを入力するために複数のコントロールを追加します。まず、TextInput
フィールドを2つ追加し、そしてComboBox
を追加します。なお、ComboBox
のdataProvider
は、インポートしたXMLファイルから生成する配列の「locModel.location
」(この配列は後ほど作成します)にバインドします。
フォームがレイアウトできたら、最後にフォームのデータを送信するように見せかけるためのボタンを追加します(このボタンの本当の機能は後ほど明らかになります)。
Form
コンテナの中にFormHeading
を追加し、label
を「Add New」に設定します。FormHeading
の後にFormItem
を追加し、label
を「First Name」に設定します。FormItem
コンテナの中にTextInput
を追加し、id
を「fNameInput」に設定します。FormItem
をもう1つ追加し、label
を「Last Name」に設定します。FormItem
コンテナの中にTextInput
を追加し、id
を「lNameInput」に設定します。FormItem
をもう1つ追加し、label
を「Location」に設定します。FormItem
コンテナの中にComboBox
を追加し、id
を「locCombo」、dataProvider
プロパティを「locModel.location
」へのバインドに、それぞれ設定します。Form
ブロックの後にあるControlBar
コンテナの中にボタンを追加し、id
プロパティとclick
プロパティを次のように設定します。
<mx:FormHeading label="Add New"/>
<mx:FormItem label="First Name"> </mx:FormItem>
<mx:TextInput id="fNameInput"/>
<mx:FormItem label="Last Name"> </mx:FormItem>
<mx:TextInput id="lNameInput"/>
<mx:FormItem label="Location"> </mx:FormItem>
<mx:ComboBox id="locCombo" dataProvider="{locModel.location}"/>
<mx:Button label="Add Employee"
click="dataController. addNewEmp(newEmpModel,empGrid.dataProvider)"/>
dataController
とそのメソッドは後ほど作成します。上記のメソッドの引数は、その段階で理解できるようになります。DataGridコントロールの追加
次に、これまでのチュートリアルの中で使用したことのないクラス、DataGrid
コントロールのインスタンスを追加します。DataGrid
コントロールは、各列がソートできるうえに、セルを編集することも可能な、データを視覚化するためのパワフルなツールです。DataGrid
コントロールは、そのdataProvider
としてオブジェクトの配列を受け付けます。グリッドの列は、DataGrid
の中にネストした<columns>
ブロックの中に、一連のDataGridColumn
コンテナを記述して定義します。なお、columnName
プロパティの値には、dataProvider
のオブジェクトのいずれかのプロパティを設定します。DataGrid
コントロールは、次の構文で記述します。
<mx:DataGrid> <mx:dataProvider> {何らかのオブジェクトの配列} </mx:dataProvider> <mx:columns> <mx:Array> <mx:DataGridColumn columnName="propertyName1"
headerText="some text" /> <mx:DataGridColumn columnName="propertyName2"
headerText="some text" /> </mx:Array> </mx:columns> </mx:DataGrid>
DataGrid
のアイテムをドラッグできるようにするには、「dragEnabled="true"
」を設定します。なお、ユーザーがドラッグしたデータオブジェクトをグリッド内へドロップできるようにするには、数種類のドラッグ関連イベントをハンドラに対して設定できますが、最も重要なのは次に挙げるものです。
dragEnter
:アイテムがグリッド上にドラッグされたことを告知dragDrop
:アイテムがグリッド上にドロップされたことを告知
次に示すステップでは、ユーザーが全従業員用のグリッドからアイテムをドラッグし、エンジニアリンググループまたはサポートグループ用のグリッドにそのアイテムをドロップするための機能を追加します。なお、これらのイベントに対するハンドラは、後ほど、コントローラーのメソッドとして記述します。
Panel
コンテナ内のForm
コンテナの前にDataGrid
コンテナを追加し、「id="empGrid"
」と「dragEnabled="true"
」を設定します。DataGrid
コンテナの中にdataProvider
ブロックを追加し、「empModel.employee
」へのバインディングを記述します。
<mx:DataGrid id="empGrid" dragEnabled="true"> </mx:DataGrid>
<mx:dataProvider> {empModel.employee} </mx:dataProvider>
dataProvider
に供給するデータは後ほど作成します。DataGrid
ブロック内のdataProvider
ブロックの後にcolumns
ブロックを追加し、この中にArray
ブロックを追加します。Array
ブロックの中にDataGridColumn
を追加し、columnName
を「fName」、headerText
を「First Name」にそれぞれ設定します。DataGridColumn
コンテナをさらに2つ追加し、それぞれに次のプロパティを設定します。columnName="lName"
(lNameの1文字目は「L」の小文字)headerText="Last Name"
columnName="location"
headerText="Location"
DataGrid
のすべてのコード部分をクリップボードにコピーし、「id="engPanel"
」を設定したPanel
コンテナの中にペーストします。- 新しく作成した
DataGrid
コンテナ内のdataProvider
ブロックと、id
プロパティ、ならびにdragEnabled
プロパティを削除して、新たにdragEnter
プロパティとdragDrop
プロパティを次のように記述します。dragEnter="dataController.doDragEnter(event)"
dragDrop="dataController.doDragDrop(event)"
- エンジニアリンググループ用の
Panel
コンテナ内のDataGrid
コードをクリップボードにコピーし、コピーした内容を「id="susPanel"
」が設定されたPanel
コンテナの中にペーストします。この際、ペーストしたコードを編集する必要はありません。
<mx:columns> <mx:Array> </mx:Array> </mx:columns>
<mx:DataGridColumn columnName="fName"
headerText="First Name" />
<mx:DataGridColumn columnName="lName" headerText="Last Name" /> <mx:DataGridColumn columnName="location"
headerText="Location" />
<mx:DataGrid dragEnter="dataController.doDragEnter(event)"
dragDrop="dataController.doDragDrop(event)"> <mx:columns> <mx:Array> <mx:DataGridColumn columnName="fName"
headerText="First Name" /> <mx:DataGridColumn columnName="lName"
headerText="Last Name" /> <mx:DataGridColumn columnName="location"
headerText="Location" /> </mx:Array> </mx:columns> </mx:DataGrid>
DataGrid
ブロックが記述できたはずです。なお、2つ目と3つ目のDataGrid
ブロックは全く同じコードです。正しいコードが記述できたかは、完成した「data.mxml」ファイルのコードと比較して確認してください。