Hatena::ブログ(Diary)

やさしいデスマーチ このページをアンテナに追加 RSSフィード

札幌のWebエンジニアの綴る日常と開発の日々。
GoogleAppEngine/slim3/Django/NetBeans/Swing/JavaFXを中心にお届け。

2009-10-31

第3回Android勉強会

| 02:11 |  第3回Android勉強会を含むブックマーク

札幌Javaコミュニティと日本Androidの会札幌支部は勉強会の運営母体としては一緒でそれぞれ活動している、そんな関係です。現在は、ちょうど去年の11月の勉強会を第1回として4回目のAndroid勉強会です。だいたい年4回のペースでAndroidの日を設けていますが、今後は増えるかもしれないしこのくらいかもしれません。

やったこと

前日のJavaFestaで来札されていた有山さんと札幌支部のまいむぞうさん・sakさんの3人が1時間づつ話をしました。内容としては有山さんとまいむぞうさんが、Androidを使ったイベントの参加者管理システムであるところのAtenderの話、sakさんがJNIでAndroidからネイティブコードを呼ぶ話です。Atenderの話はクライアント側はソースをざっくりと説明しながらアプリの作り方全体を見る感じ、サーバ側はAppEngineの話がメインでした。JNIはsakさんの会社で使ったという事例から簡単なサンプルの解説です。

参加者

今回はアンケートもとっていたのですが、いつものJava勉強会とは毛色が違って、あまりJavaに近い人は少なく、組み込み系の人が多いような印象を受けました。参加者は講師・関係者をのぞくと10名。ほかの地域に比べると少ないのかな?とは思いますが、ビジネス色がゼロな勉強会なので仕方ないかもしれません。

また、ほとんどの参加者は入門書1冊程度は軽く目を通した程度でHelloWorldとボタン程度は理解している様子でした。なので全くの入門の内容だと物足りなく、深い部分だと難しすぎる、そんな感じかもしれません。次回は、ちょっとしたアプリを開発するような開発集会でもやった方がいいかな、という印象でした。

今後の予定

次のAndroid勉強会の予定は1月か2月かその辺りの予定です。アンケートを見る限り、隔月か3ヶ月に1回くらいのペースでやって欲しいとのことなので、もう少し開催頻度があがるかもしれません。最初のうちはJava勉強会と同時開催でとも考えていたのですが、参加者層があまり冠らないなという印象も強いので、当面は並列で進めようかと考えています。

2009-10-30

JavaFesta2009参加

| 09:49 | JavaFesta2009参加を含むブックマーク

来場者は300人くらいですかね。盛況のようですが、金曜日となると会社が認めてくれないと参加できないので悲しい思いをしている人も多数。

軽く参加したセッションの内容と感想です。

続きを読む

2009-10-29

JavaFXでSingleton

| 21:27 |  JavaFXでSingletonを含むブックマーク

少しだけ話題になっている(?)風なのでJavaFXでのSingletonの実現方法について考察してみます。

まず、JavaFXの特徴としてstatic変数(メソッド)がありません。これに対応するものとしてはスクリプトレベルの変数関数)が、だいたい似たような機能を果たします。

したがって、第1の方法として次のようにインスタンスを1つスクリプト変数に定義しておく事が考えられます。

public-read var INSTANCE = SingletonClass {};
public function getInstance():SingletonClass {
    return INSTANCE;
}
class SingletonClass {
}

id:skrbさんもこちらのエントリーで書いてますし、casperさんのこちらのエントリーでも言及されている方法です。

続きを読む

2009-10-28

シーケンスをキャストしてはまった事

| 00:50 |  シーケンスをキャストしてはまった事を含むブックマーク

今日はページングコンポーネントの紹介か、アドレス帳アプリをサンプルで公開しようかと思っていたのですが、シーケンスのキャスト関連で嵌ってしまいました。まずはこちらのスクリプトをご覧ください。

var obj:Object = [1, 2];
var sequence:Object[] = obj as Object[];
println(sequence.size()); // => 1!

オブジェクトとしてはサイズ2のシーケンスが1つ生成されており、変数objに代入していますが、この時に型をObjectとしています。その参照を再度Objectのシーケンスでキャストしてみると、サイズが1になってしまいます。

Javaで書けばこんな感じですが、当然ながら結果は2です。

Object obj = new int[]{1, 2};
int[] array = (int[]) obj;
System.out.println(array.length); // => 2

どうもJavaFXではコンパイルされたシーケンスはcom.sun.javafx.runtime.sequence.ArraySequenceクラスのインスタンスとして処理されるようですが、このクラスがシーケンスで処理されるとサイズ1でArraySequenceのインスタンスを保持するシーケンスになる・・・そんな状況です。

現時点での回避方法は次のようにします。

sequence = for (item in (obj as com.sun.javafx.runtime.sequence.ArraySequence)) item;
println(sequence.size()); // => 2

JavaFXのfor式はJavaと同様にIteratableなオブジェクトならばコンパイラを通るようなので、ArraySequenceにキャストしてからシーケンスを生成しなおす(それもArraySequenceですけど・・・)わけです。

こんな箇所ではまるほどJavaFXをやっている人はあまりいないとは思いますが、1.2.1ではそんな状況なので置きを付けください。

2009-10-27

JavaFXで自作のシーングラフのノードを作成する

| 00:08 |  JavaFXで自作のシーングラフのノードを作成するを含むブックマーク

JavaFXでは描画対象のオブジェクトは「シーングラフのノード(以下、ノード)」と呼ばれ、javafx.scene.Nodeを基底クラスとしたクラスのインスタンスになります。JavaFX 1.2.1時点でそれなりの数のノードは用意されていますが、それなりに凝ったGUIを作成するには足りません。しかし、JavaFXではノードを自作しやすいようにデザインされているため、非常に簡単にカスタムノードを作る事ができます。今回は、カスタムノードをどのように設計するかを解説します。

最初に最初にNodeを起点としたクラスの階層構造を把握します。これを把握しているとどのクラスを拡張して、カスタムノードを作れば良いかが解りやすくなります。尚、具象クラスはもっとたくさんありますが、このくらいを把握しておけば良いでしょう。

javafx.scene.Node

javafx.scene.shape.Shape

┃ ┗ javafx.scene.shape.Path

javafx.scene.Parent

  ┣ javafx.scene.Group

  ┃ ┗ javafx.scene.layout.Container

  ┃   ┣ javafx.scene.layout.HBox

  ┃   ┗ javafx.scene.layout.Panel

  ┗ javafx.scene.CustomeNode

    ┗ javafx.scene.Control

それでは、それぞれの役割と使い方をみていきます。

続きを読む

2009-10-26

モーダルダイアログを表示する

| 23:44 |  モーダルダイアログを表示するを含むブックマーク

昨日はJavaFXで背後のノードをブロックする機能を作ったので、それを応用してモーダルダイアログを実装してみました。いわゆるOKのみを表示する情報ダイアログ、YES/NOの質問型、OK/Cancelの確認型、好きなノードを表示できる汎用型の4種類です。

f:id:shuji_w6e:20091026233522p:image

サンプルはこちらから確認できますが、セキュリティクリアランスに注意して閲覧してください。

コールバック関数

ダイアログはModalWindow.xxx 関数を使用して表示しますが、ブロッキングするタイプの関数ではありません。したがって確認メッセージを表示しますが、メインスレッドをブロックしません。ウィンドウを閉じたときに行われる処理についてはコールバック関数として関数に渡します。

ModalWindow.confirmMessage(box, "Confirm", "よろしいですか?", function(result:Boolean):Void {
    if (result) { // OK の場合の処理
    } else { // NGの場合の処理
    }
});

この辺りの感覚はJavaScriptに近く、Javaよりも直感的な記述ができるので便利です。

2009-10-25

画面の操作をブロックする

| 00:31 |  画面の操作をブロックするを含むブックマーク

いわゆるモーダルダイアログなど、一時的にメインとなる画面の操作をブロックしたい事があります。また単にブロックするだけではなく、背景を暗くする・スモークをかける・フェードイン/アウトするなどのエフェクトがあるとよりリッチなGUIとなります。また、背景を暗くする事などはメインとなるダイアログ等を目立たせるという効果もあり、LightBox系のコンポーネントでも使われているテクニックです。

今回はそんなメイン画面をブロックするようなユーティリティクラスをJavaFXで実装したので紹介します。

f:id:shuji_w6e:20091026002609p:image

f:id:shuji_w6e:20091026002610p:image

f:id:shuji_w6e:20091026002611p:image

サンプルはこちらから、OverlayBlockerを選択して確認ください。

続きを読む

2009-10-24

NetBeans 6.8 Beta リリース

| 20:17 |  NetBeans 6.8 Beta リリースを含むブックマーク

先日、NetBeans 6.8 Beta がリリースされました。今回のアップデートはJavaEE6対応がメインであるため、それ以外の機能については控え目なアップデートのようです。

f:id:shuji_w6e:20091024200710p:image

最近、自分が使っているのはもっぱらJavaFXですので、JavaFXに関する機能を試してみました。

強化点

軽く使ってみた感じでは、大きく機能が改善したり強化されたような感覚はありません。

というわけで、JavaFXを主としてNetBeansを利用している人は無理に6.8Betaは使う必要ないでしょう(結論?)

バグっぽいもの

6.7.1では発生していないけど6.8Betaで見つけた不具合です。

- import文の警告が不安定

- 例外をthrowもcatchもしていないと警告が出る(Unreported Exception)

これはなんでしょうかね、エディタ部分を大幅に修正している段階なのでしょうか・・・。

あるべき機能の未実装

次の機能は未だに実装されていません・・・。6.8の正式版では対応していることを祈りつつ・・・。

- コメント/コメント解除

- コードフォーマット(重要!)

最近起きている問題

JavaFXの実行なのですが、フルコンパイルしJarを作成して実行されます。なので、小さなプロジェクトならばいいのですが、ソースが多くなってくると実行の度に大変な時間がかかってしまします。早急に差分コンパイルと実行を出来るようにしてほしいですね。

尚、NetBeansアイコンがねこびーんになっていなかったのですが、これは不具合かもしれません。

2009-10-23

簡易JSONシリアライザを作ってみた

| 22:57 |  簡易JSONシリアライザを作ってみたを含むブックマーク

JavaFXではJSONXMLを扱うAPIが用意されていますが、読み込みしか出来ない上にStAXと同じような実装で、少々面倒な所があります。今後、使いやすいAPIが出てくるかもしれませんが、現状でちょっとしたJSONを読み込んだり書き出したりする目的で簡易シリアライザ/デシリアライザを実装してみました。

続きを読む

2009-10-21

アプリケーションフレームワークとしてのJavaFX

| 21:53 |  アプリケーションフレームワークとしてのJavaFXを含むブックマーク

約1ヶ月に渡って各種エフェクトやコンポーネントを実装してきましたが、ノウハウもある程度溜まったのでそれっぽいアプリケーション(の雛形)を作ってみました。

f:id:shuji_w6e:20091021215144p:image

実行(JavaWebStart)はこちらから、ソースコードこちらですべて公開しています。

尚、マウスドラッグイベントにバグがあるようです。ウィンドウの移動に関して挙動がおかしいのはご愛嬌ということで(笑)

これまで作ってきたフォームやグリッド、タブメニューなどをまとめてアプリケーションとして使いやすいようにフレームワークを組んでいます。また、OS等に依存するウィンドウのフレーム部分を非表示にし、ありがちとも思えますが独自のウィンドウを描画しています。この独自ウィンドウも高々数十行の記述で実現しています。

さて、アプリケーションを作るときに必要そうなコンポーネントはそれなりに作成してきました。これからは品質を高めて柔軟に使えるような修正をしていこうと考えています。それが実現できると、ちょっとしたアプリケーションであればサクサクとJavaFXで作れるように・・・・なればいいなーと思います。

hide1080hide1080 2009/10/23 00:05 素晴らしいです!時間ができたら試させてもらいます。

2009-10-20

Gridを作成してみた

| 01:01 |  Gridを作成してみたを含むブックマーク

連続更新は途絶えてしまいましたが、ネタはもうしばらくJavaFXです。

今日は見栄えのいいグリッド(テーブル)を作成してみました。CustomNode、Containerなどを駆使し、モデルをグリッド表示します。

f:id:shuji_w6e:20091021005403p:image

現状のJavaFXデフォルトではシンプルなリストしか用意されていませんが、アプリケーションを作成していくには必須なコンポーネントです。現状はソート機能やページング機能などはありませんが、拡張していくことでより便利に使いやすいライブラリになればと考えています。

ソースコードこちらから、サンプルはこちらから確認ください。

構造

Gridの構造としてはHTMLのTableと同じような構造にしました。つまり、GridがありGridRowを持ち、GridRowはGridCellを持つという構造です。さらにCellを配置するためのレイアウトクラス(Container)を作成して、配置を行っています。

意外と面倒になってくるのは幅や高さの算出です。色々と試行錯誤した結果、いったん配置してから幅や高さを算出し、それにあわせて再レイアウトすることが最善であるとなりました。

2009-10-18

JavaFXのリフレクションAPIを使ってみる

| 09:28 |  JavaFXのリフレクションAPIを使ってみるを含むブックマーク

JavaFXJavaによく似た静的な言語仕様なのでリフレクションAPIも用意されています。しかし、Javaのクラスとは異なったJavaFXクラスであり、インスタンスの生成処理などが異なるため、まったく同じではありません。

JavaFXでリフレクションを使って特定のクラスのインスタンスを生成するサンプルは以下のようになります。

import javafx.reflect.FXLocal;
import javafx.reflect.FXContext;
import javafx.reflect.FXObjectValue;
import javafx.reflect.FXClassType;

var ctx:FXContext = FXLocal.getContext();
var cls = ctx.findClass("javafx.scene.control.TextBox");

var objValue:FXObjectValue = cls.allocate();
objValue.initVar("content", ctx.mirrorOf("OK"));
objValue.initialize();

var obj:TextBox = (objValue as FXLocal.ObjectValue).asObject() as TextBox;
println(obj);
println(obj.value);

javafx.reflect.FXContextがリフレクションAPIで最も重要なクラスでクラスのコンテキストメタデータ)にアクセスする為に使用します。

クラスのインスタンスの生成には、コンストラクタを呼び出すのではなく、

  1. allocateでインスタンスのビルダクラスを生成
  2. initVar等でインスタンスの初期値を設定
  3. initializeで初期化を行う

という手順を踏みます。これはJavaFXの宣言的文法を手続き的に置き換えているため、このような形式になっていると考えられるでしょう。尚、初期値を与える必要がなければ、cls.newInstance()でallocateとinitializeをまとめて行うことができます。

また、FXObjectValue はビルダクラスに相当するため、インスタンスの参照を得るにはさらにFXLocal.ObjectValueのasObjectメソッドを呼び出す必要があります。

以上、簡単ですがリフレクションAPIの紹介でした。

2009-10-17

アコーディオンのエフェクト

| 20:27 |  アコーディオンのエフェクトを含むブックマーク

今日のJavaFXのネタはアコーディオン風のメニューです。ウェブページなどでよく見かける、クリックするとメニューやコンテンツがスーっと表示されるアレです。

f:id:shuji_w6e:20091017201550p:image

アニメーションを使用してノードの高さを調整すれば簡単かなと思いましたが、意外と手こずりました。とはいえ、解ってしまえばソースコードは30行程度・・・。

サンプルはこちらからどうぞ。

続きを読む

2009-10-16

PullParserによるJSONのパース

| 20:14 |  PullParserによるJSONのパースを含むブックマーク

JavaFX Scriptは非常に使いやすい言語仕様なのですが、数少ない不満点はマップ(ハッシュ・辞書)に相当する構文がないことです。JavaAPIシームレスに使えるのでjava.util.Mapは使用できますが、いまいち使いにくい事は否めません。これが顕著に現れてしまうのはJSONのParseではないでしょうか。

今回はちょっとわかりにくいJSONパースについてAPIの使い方を解説します。基本的な考え方はXMLと同じようにみなしてイベントが発生するということです。

続きを読む

2009-10-15

JavaFXのローカリゼーション

| 21:12 |  JavaFXのローカリゼーションを含むブックマーク

ネタが切れてきたのでコネタで更新。

Javaにも強力なローカリゼーションの仕組みはありますが、JavaFXでも同様にさらに簡単にメッセージの国際化を行うことができます。

リソースファイル(.javafxproperties)を作成し、キー=バリューの形式でメッセージを記述するところは同じですが、native2asciiで変換する必要はありません。また、次のようにデフォルトの文字列はスクリプト内に記述できます。

var name:String = "shuji_w6e";
var message:String = ##[MESSAGE_KEY]"Hello, {%1$s name}";

メッセージのリソースファイルは例えばHello_ja.javafxpropertiesとなり、

”MESSAGE_KEY" = "こんにちは、%1$sさん"

となります。

デフォルトで文字列フォーマットにも対応しているため、柔軟なメッセージの多言語対応を行うことができるでしょう。

尚、もっと細かくメッセージを制御したい場合はjavafx.util.StringLocalizerを使用します。

2009-10-14

コンテキストメニューを実装してみる

| 20:26 |  コンテキストメニューを実装してみるを含むブックマーク

今日のJavaFXは右クリックなどで表示されるコンテキストメニューの実装です。

f:id:shuji_w6e:20091014200844p:image

デフォルトで用意されていてもいいとは思いますが、各種プラットフォームで利用可能かどうかという問題もあります。したがって、ディスクトップ専用になりがちなリッチなUIサードパーティライブラリや自作になることが多いのではないでしょうか?とはいえ、簡単に作れてしまうのがJavaFXの最大の特徴であります。このようなカスタムGUIを実装するのに150行程度で済むとはほんとうに素晴らしい。

動作サンプルソースコードはそれぞれリンク先にて。

続きを読む

JavaFXなう

| 21:03 |  JavaFXなうを含むブックマーク

JavaFXのネックとして、情報の少なさがあります。そこで現時点で使えるようなサイトをピックアップしておきます。尚、JavaFXはかなり仕様が変化してきているため、古くともJavaFX1.1以降の情報、できれば1.2以上の情報を扱っているところをチェックした方がいいでしょう。

続きを読む

2009-10-13

ツールチップ

| 21:16 |  ツールチップを含むブックマーク

昨日のエントリーに比べるとずいぶんと地味ですが、今日はロールオーバー時のツールチップを作ってみました。

f:id:shuji_w6e:20091013205751p:image

例のごとくソースファイルサンプルはそれぞれリンク先から確認ください。

続きを読む

2009-10-12

カバーフロー風のエフェクト

| 21:42 |  カバーフロー風のエフェクトを含むブックマーク

先日作成したウィンドウを使ってカバーフロー風のエフェクトを作ってみました。

f:id:shuji_w6e:20091012212616p:image

動作サンプルソースコードはそれぞれリンク先にて。

エフェクト時のアニメーションのアルゴリズム(計算式?)はJavaFXサンプルを参考にしました。

PerspectiveTransform

今回のポイントは透視変換(Perspective Transform)です。

透視変換とは遠近法などを使いオブジェクトを立体的に見せる手法です。JavaFXでは平面(シーングラフ)を簡単に3D風に変換するエフェクトであるPerspectiveTransformが用意されているので、これを使用します。

本来の透視変換では視点・焦点などを元に行列を作成し座標変換する・・・というものですが、JavaFXでは非常にシンプルな形で定義できます。

effect: bind PerspectiveTransform {
    ulx: bind lx, uly: bind uly
    urx: bind rx, ury: bind ury
    llx: bind lx, lly: bind ury + height
    lrx: bind rx, lry: bind uly + height
}

ここではbindを使っているので良くわからないかもしれませんが、ulx(upper left X)、uly(upper left Y)...uly(under left Y)という4点を指定するだけです。この4点で囲まれた矩形の中に投射するような形でシーングラフが表示されます。したがって、この4点を台形としZ軸を少し考慮してあげればスクリーンショットのような形にすることができるわけです。

アニメーション

アニメーションをスムーズにおこうなうためにsinカーブを用いています。

    var angle:Number = 45;
    var lx:Number = bind width/2 - Math.sin(Math.toRadians(angle)) * width/2;
    var rx:Number = bind width/2 + Math.sin(Math.toRadians(angle)) * width/2;
    var uly:Number = bind 0 - Math.cos(Math.toRadians(angle)) * height / 10;
    var ury:Number = bind 0 + Math.cos(Math.toRadians(angle)) * height / 10;

angle(角度)は45℃の時が左側の状態、90°が中央、135°が右側です。90°の時にlxとlyはちょうどwidthとなり、角度を変化させる事で自然に立体的に変化していきます。この角度変化はTimelineで行うというわけです。

加藤加藤 2009/11/13 14:37 いつも参考にさせていただいております。
大変恐縮ではございますが、カバーフロー風のエフェクトのソースコードが見られない状況でございます。
よろしければ、新たにリンクを張っていただくか、メールアドレスに添付して頂けるとありがたいです。
とても気になるエフェクトなため、可能であればよろしくお願いいたします。

shuji_w6eshuji_w6e 2009/11/13 15:08 ご覧いただきありがとうございます。
ソースコードはリポジトリの構成を変えてしまったため、移動していました。
http://trac.deathmarch.jp/sunflower/browser/trunk/sunflower/src/jp/sunflower/javafx/scene/CoverFlow.fx
本文の方も修正しておきます。

2009-10-11

ウィンドウを描いてみた

| 00:01 |  ウィンドウを描いてみたを含むブックマーク

現在のJavaFXではアラートなどサブウィンドウの表示はあまり見栄えの良いものがありませんので作ってみました。

f:id:shuji_w6e:20091011234821p:image

動作サンプルソースコードです。

続きを読む

2009-10-10

JavaFXでLightbox

| 23:12 |  JavaFXでLightboxを含むブックマーク

JavaFXはやれば出来る子。

今日はもりもりとエフェクトをかけたリッチなGUIを作ってみました。WEBではよく見かけるLightboxです。

f:id:shuji_w6e:20091010230251p:image

動くサンプルはこちらから。

尚、エフェクトは若干やりすぎた感もありますが、反省はしていません。

色々と実装してみて良くわかったのは、アニメーション(Timeline)の定義が非常に楽ということです。Flashのようにキーフレームを設置して・・・という感覚ではなく、ここからキックされて、何秒後にどうなるということを宣言的に解りやすく記述できるのはJavaFXの特徴でしょう。ソースコード

こちらからご覧ください。

でも、マウスイベントが結構拾われないんだよなぁ・・・今後の改善を求む&ライブラリの改修が必要。

2009-10-09

ローディングアイコンの作成

| 21:18 |  ローディングアイコンの作成を含むブックマーク

本日のJavaFXはローディング中などに表示されるアイコンです。

f:id:shuji_w6e:20091009210327p:image

サンプルはこちらから。サンプルは大量にアニメーションをかけているので、環境によっては少々重いかもしれませんがご了承ください。

続きを読む

2009-10-08

ドラッグ&ドロップ

| 20:55 |  ドラッグ&ドロップを含むブックマーク

定番ですが、ドラッグ&ドロップのできるノードJavaFXで実装してみました。

f:id:shuji_w6e:20091008203903p:image

実装自体は簡単なので、後は使いやすいようなインターフェイスにすることが重要です。いつものごとく、サンプルとソースコードこちらから*1

続きを読む

*1MacSafariだとキャッシュがしつこくて中々反映されないですorz

2009-10-07

カスタムコンポーネントでメニューを作ってみた

| 20:31 |  カスタムコンポーネントでメニューを作ってみたを含むブックマーク

世の中はFlexFlash) vs HTML5 vs Silverlightで、JavaFXなんて比較もされていませんが、どのようなRIAライフをお過ごしでしょうか?

さて、今回はグローバルナビゲーションとかタブメニューとかそんなコンポーネントのサンプルです。

f:id:shuji_w6e:20091007202148p:image

f:id:shuji_w6e:20091007202149p:image

いつものようにサンプルはこちらか確認できます。ソースコード類も公開しているので興味のある人はご覧ください。

続きを読む

2009-10-05

フォームの作成

| 02:55 |  フォームの作成を含むブックマーク

懲りずにJavaFXのネタです。

JavaFXの可能性を探っているわけですが、JavaFXでは非常に扱いやすいGUIコンポーネントの記述が特徴です。しかし、実際に開発を行うとすればGUIがどれだけ記述しやすくとも、管理画面などがサクサク書けなければ意味がありません。JavaFXではちょっと工夫すれば簡単にカスタムコンポーネントを作ることができますし、LayoutManager的なものも簡単に作れます。

そこでこんなイメージのフォームを作れるように試行錯誤してみました。

f:id:shuji_w6e:20091006023050p:image

動く画面とソースコードこちらから。

続きを読む

2009-10-02

ControlとSkin

| 23:42 |  ControlとSkinを含むブックマーク

JavaFXネタです、すいません><

JavaFXのコントロールはボタンやテキストボックスなどのユーザ入出力のあるコンポーネントを提供する仕組みですが、Skinにより柔軟に見た目を変えることが出来ます。また、Behaviorはコントロールの振る舞いを定義するクラスになります。簡単に整理しましょう。

Skin

Skinはコントロールの中核となるクラスでコントロールの実態となるNodeを保持します。これはCustomNodeと同様の仕組みです。

SkinはControlとSkinの両方を参照し、保持するNodeのイベントを受け付けると、BehaviorまたはControlにハンドリングします。

Control

Controlはデベロッパが直接使うNodeで、初期化時にはコントロールの持つ属性(例:ボタンのラベル、画像のパス、クリック時の振る舞い)などを設定します。

ControlはSkinを保持しており、初期化時に設定された属性はSkinに渡され、Skinの見た目に反映されます。

また、ユーザがSkinに対してなんらかのアクションを起こした場合(例えばマウスクリック)、実行する処理を関数として設定する事になります。

SkinはControlを参照しているので、Skin内のNodeのonMouseClickなどのイベントに合わせて呼び出されるわけです。

Behavior

BehaviorはSkinを保持しており、Skinの振る舞いを定義するクラスです。ここで言う振る舞いとは、例えばマウスオーバー時のアニメーションやプログレスバーのアニメーションなどであり、クリック時の処理等ではありません。クリック時の処理等は、Controlにインスタンス毎に定義されるわけですから、Behaviorにはそのコントロールの持つ普遍的な振る舞いが定義されます。

尚、振る舞いがそれほど複雑でない場合は、Skinに記述すれば充分でしょう。

続きを読む