イベントについて[Flex]

Flexをやる上で重要な要素になると思います。
結構使う機会の多いイベントをまとめます。

           ※自分自身の構築が終わっていても配下のコンポーネントの構築が
             完了していない場合がある。null参照になる場合があるので注意

    • creationComplete
      • コンポーネントの構築、プロパティ処理、測定、レイアウトおよび描画が完了したときに送出される

           ※このタイミングは配下のコンポーネントの構築も完了しているので確実にアクセスできる

  • <よく使うイベント>
    • click
      • クリックされた場合、またはフォーカスのあるボタン上でSpaceキーが押された場合

           ※Enterキーでは反応しない

    • doubleClick
      • ダブルクリックされた場合

           ※doubleClickEnabledプロパティを有効にする必要あり

           ※テキスト系のコンポーネントのテキストが変更された場合や、
            リスト系のコンポーネントの選択されている要素が変更された場合

  • <その他>
    • dispatchEvent
      • ユーザー操作ではなく、スクリプトでコンポーネントのプロパティを変更したい場合はFlex側では自動的にイベントを投げない。そのため下記のようにイベントを投げる必要あり
ex) イベントを投げたいコンポーネント.dispatchEvent(new Event("イベント名"))
    • イベントの発生元の取得
      • event.currentTargetで取得できる
    • イベントの伝播を止めたい場合
      • event.stopImmediatePropagetion()メソッドを呼び出すと以降のイベントリスナーが処理されない。

イベントたくさんありますが、このくらい覚えておくといいかもしれませんね。
ではでは

ポップアップ関連[Flex]

覚えておきたいメソッド

  • ポップアップを表示する
    • PopupManager.addPopup(*1, *2, *3)

     *1:ポップアップさせたい画面
     *2:ポップアップを表示したい画面
     *3:trueにしておくとポップアップ表示中は、ポップアップ以外が操作不能になる

  • ポップアップを画面中央に表示する
    • PopupManager.centerPopup(*1)

     *1:ポップアップさせたい画面

  • ポップアップを消す
    • PopupManager.removePopup(*1)

     *1:ポップアップさせたい画面

覚えておきたい処理

  • ポップアップからデータを受け取る
    • イベントリスナーを登録(イベントは「FlexEvent.REMOVE」)
    • 処理を以下のように記述
    var popup : *1 = event.currentTarget as *1
    //*1はポップアップ画面
  • ポップアップをEscキーで消す
    • イベントリスナーを登録(イベントは「KeyboardEvent.KEYDOWN」)
    • 以下のように処理を記述
    //イベント時に呼び出すメソッド
    public function removeDisplay(event : KeyboardEvent) : void {
        if(event.charCode == Keyboard.ESCAPE) {
            *1.dispatchEvent(new CloseEvent(CloseEvent.CLOSE));
        }
    }
    //*1はポップアップ画面の型の変数

今日はこのへんで

アイテムレンダラ[Flex]

Flexに詳しい人と話していて、このアイテムレンダラを
使えるかどうかでFlexを理解しているかどうかがわかると
言ってました。
個人的な感覚でいえばとっつきづらいけど、仕組みを理解
してしまえば一気に理解が深まる感じですね。
僕の理解がどこまでのものかはわかりませんが、今回は
データグリッドにチェックボックスを表示するアイテム
レンダラをサンプルにしたいと思います。

ポイント

  • アイテムレンダラを定義するクラスを作成
    • アイテムレンダラを作りたいコンポーネントを継承する。(今回はCheckBox)
    • プロパティを設定する
  • IFactoryクラスを作成する
    • newInstance()メソッドの戻り値に上記の定義したアイテムレンダラを設定する。

サンプル

//アイテムレンダラの定義
//CheckBoxRenderer.as
import mx.controls.CheckBox;
import mx.controls.dataGridClasses.DataGridListData;

public class CheckBoxRenderer extends CheckBox
{
    public function CheckBoxRenderer()
    {
        super();
    }
    override public function set data(dto:Object):void {
        super.data = dto;

        //データフィールドの値をselectedプロパティにセット
        var colData : DataGridListData = DataGridListData(listData);
        selected = super.data[colData.dataField];
    }

}

//IFactory
//CheckBoxRendererFactory.as
import mx.core.IFactory;

public class CheckBoxRendererFactory implements IFactory
{
    public function CheckBoxRendererFactory()
    {
    }
    public function newInstance() : *
    {
        var itemRenderer : CheckBoxRenderer = new CheckBoxRenderer();
        return itemRenderer;
    }
}
<!-- DataGridへの設定 ※MXMLは適当に端折ります -->
<!-- DataGridSample.mxml -->
xmlnsにCheckBoxRendererFactoryを呼び出せるようにしておく

<!-- newInstance()メソッドを実装したクラスを呼び出す -->

<renderer:CheckBoxRendererFactory id="check" />

<!-- DataGridColumnにitemRendererを設定 -->
<mx:DataGridColumn id="check" 
                   headerText="チェック"
                   dataField="checkBox"
                   textAlign="center"
                   itemRenderer="{check}" />

実行結果

※画像参照(この画像では一行目にselectedの値をtrue、二行目をfalseに設定しています)

dataFieldとかは適当に設定して試してみてください。
ではでは

和暦変換[Java]

Java1.6になって和暦変換が簡単にできるようになりました。
topicとして非常に気になったのでサンプルを作りました。

ポイント

  • Localeの設定
    • 言語、国、バリアントを"JP"に設定する。
  • Calendar.ERAに和暦に対応した数値を設定する。
    • 対応する数値は以下の通り
元号 数値
明治 1
大正 2
昭和 3
平成 4
  • 日付のフォーマット
    • "GGGGyy年MMMMd日"→「平成yy年mm月d日」
    • "Gyy/M/d"→「Hyy/m/d」
サンプル
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;

public class DispJapaneseCalendar {
    public static void main(String[] args) {

    int year = 21;
    int month = 10;
    int day = 8;

    //ロケールの設定
    Locale.setDefault(new Locale("ja", "JP", "JP"));

    //日付のフォーマット
    SimpleDateFormat warekiFormat = new SimpleDateFormat("GGGGyy年MMMMd日");
    SimpleDateFormat slushedFormat = new SimpleDateFormat("Gyy/M/d");

    Calendar cal = Calendar.getInstance();

    //ERAの設定
    cal.set(Calendar.ERA, 4);

    cal.set(year, month - 1, day);
    System.out.println(warekiFormat.format(cal.getTime()));
    System.out.println(slushedFormat.format(cal.getTime()));

    }
}
実行結果
平成21年10月8日
H21/10/8

こんな感じでサンプルを書いていきたいと思ってます。
億劫になったらもうちょっと簡単に書くかも。