Flex TextInputで数値のみ入力できてカンマ区切りにするサンプル
Flex(AIR)でTextInputで数値のみ入力できてカンマ区切りにするサンプルです。
Flex(AIR) にて、テキストボックスを配置する場合、TextInput
コントロールを利用します。
今回は「数値だけしか入力することがなく、入力したらカンマ区切りにする方法」を紹介したいと思います。
Sponsored Links
目次
完成図
完成図はこんな感じになります。
Sponsored Links
入力値の制御
TextInput
の restrict
プロパティを使うことで、ユーザーの入力を制限することができます。今回は数値のみなので、restrict = "^a-zA-Z-u0009"
とします。さらに、imeMode = "ALPHANUMERIC_HALF";
と、IME.enabled = false;
も設定し、全角文字の入力ができないように制限します。
サンプルソース
NumericTextInput.as
TextInput
クラスを継承した NumericTextInput
を用意しました。
package { import flash.events.Event; import flash.events.FocusEvent; import flash.events.KeyboardEvent; import flash.events.MouseEvent; import flash.system.IME; import mx.controls.TextInput; import mx.formatters.NumberFormatter; /** * TextInput for Numeric input. */ public class NumericTextInput extends TextInput { /** * クリック時、初回のみ選択状態にする */ private var firstClickFlg:Boolean = true; /** * コンストラクタ */ public function NumericTextInput() { super(); // 入力キーの制御 this.restrict = "^a-zA-Z-u0009"; // テキストを選択状態に設定 this.addEventListener(MouseEvent.CLICK, function(event:Event):void { if ( event.currentTarget.text != "" && event.currentTarget.text != undefined ) { // 初回のみ選択状態を作る if ( this.firstClickFlg ) event.currentTarget.setSelection(0, event.currentTarget.length); this.firstClickFlg = false; } }); } /** * 小数点以下の表示設定 */ private var _precision:int = 0; public function set precision(precision:int):void { this._precision = precision; } public function get precision():int { return this._precision; } /** * @private * Gets called by internal field so we draw a focus rect around us. */ override protected function focusInHandler(event:FocusEvent):void { super.focusInHandler(event); // カンマ区切りを解除 if ( event.currentTarget.text != "" ) event.currentTarget.text = Number(this.text.replace(new RegExp(",", "g"), "")).toString(); // テキストを選択状態に設定 if ( event.currentTarget.text != "" && event.currentTarget.text != undefined ) event.currentTarget.setSelection(0, event.currentTarget.length); this.firstClickFlg = false; } /** * @private */ override protected function keyDownHandler(event:KeyboardEvent):void { super.keyDownHandler(event); this.imeMode = "ALPHANUMERIC_HALF"; IME.enabled = false; } /** * @private * Gets called by internal field so we remove focus rect. */ override protected function focusOutHandler(event:FocusEvent):void { super.focusOutHandler(event); if ( event.currentTarget.text != "" ) { var nf:NumberFormatter = new NumberFormatter(); nf.useThousandsSeparator = true; // 小数点以下の設定 nf.precision = _precision; // マイナスの表示許可 nf.useNegativeSign = true; event.currentTarget.text = nf.format(event.currentTarget.text); } this.firstClickFlg = true; } } }
コンストラクタ
restrict = "^a-zA-Z-u0009"
を記述し、入力を制限します。
以前「Flex クリックやフォーカスイン時にTextInputのテキストを選択状態にするサンプル」でもご紹介しましたが、マウスでクリックされたときに、入力値がある場合は、選択状態を作りたかったので、setSelection
を使って、テキストを選択状態にしています。
precision プロパティ(小数点以下の表示設定)
小数点の表示桁数は、外部から設定させたかったので、precision
プロパティを用意しています。デフォルトは 0 (小数点以下表示なし)です。
フォーカスインイベントハンドラ(focusInHandler)
ここでは、次の入力がしやすいように、入力値のカンマ区切りを解除しています。また、こちらもテキストを選択状態にしています。
キーダウンイベントハンドラ(keyDownHandler)
this.imeMode = "ALPHANUMERIC_HALF";
と、IME.enabled = false;
を設定し、全角文字の入力制御をしています。
フォーカスアウトイベントハンドラ(focusOutHandler)
ここでは、NumberFormatter.useThousandsSeparator
を利用して、3ケタのカンマ区切りをしています。マイナス入力も許可するために、useNegativeSign = true;
に設定しています。
NumericTextInputTest.mxml
表示する画面は以下の通りです。画面デザインを整えるために、css
を用意しています。
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:local="*" initialize="onInit()" width="600" height="80" > <fx:Script> <![CDATA[ /** * 初期化 */ protected function onInit():void { StyleManager.getStyleManager(null).loadStyleDeclarations("css/blue.swf"); } ]]> </fx:Script> <fx:Declarations> </fx:Declarations> <mx:VBox width="100%"> <mx:FormItem width="100%" label="数値入力"> <s:HGroup width="100%" gap="0"> <local:NumericTextInput id="numericTest" precision="2" width="100" textAlign="right" /> <mx:Text text="数値のみ入力できます。フォーカスを移動すると、[###,0.##]で表示されます。"/> </s:HGroup> </mx:FormItem> <mx:FormItem width="100%" label="文字列入力"> <s:HGroup width="100%" gap="0"> <mx:TextInput id="stringText" width="100" imeMode="JAPANESE_HIRAGANA" /> <mx:Text text="通常の TextInput を利用しています。"/> </s:HGroup> </mx:FormItem> </mx:VBox> </s:Application>
Sponsored Links
サンプルソースのダウンロード
サンプルソースは こちら からダウンロードできます。
おつかれさまでした。
Sponsored Links