Flex 3.0 中的NumericStepper中显示格式的问题

package com.XXX.utils

{

import flash.events.Event;

import flash.events.FocusEvent;

import flash.text.TextLineMetrics;

import mx.containers.HBox;

import mx.controls.Button;

import mx.controls.Label;

import mx.controls.NumericStepper;

import mx.controls.TextInput;

import mx.core.UITextField;

import mx.core.mx_internal;

import mx.events.FlexEvent;

import mx.formatters.DateFormatter;

import mx.managers.IFocusManager;

use namespace mx_internal;

/**

* Dispatched when the time changes, which could be either the hour, minute, or dayPart.

*/

[Event(name="change",type="flash.events.Event")]

/**

* Dispatched when the hour changes.

*/

[Event(name="hoursChange",type="flash.events.Event")]

public class NumberFormaterStepr extends NumericStepper

{

public function NumberFormaterStepr()

{

super();

this.addEventListener(FlexEvent.VALUE_COMMIT,valueCommandHandler);

}

/** * @private */ 

protected var TextInputField:TextInput; //重新做一个input框,遮盖原来的

/** * @private */ protected var _newvalue:Number = 0; //新的属性,用于存值

/** * @private */ private var _enabled:Boolean=true; //是否启用

override protected function createChildren():void//重写创建子对象方法

super.createChildren(); 

var widestNumber:Number=61; 

var lineMetrics:TextLineMetrics = measureText(widestNumber.toString()); 

var textWidth:Number = lineMetrics.width + UITextField.TEXT_WIDTH_PADDING+4;

 

if (!TextInputField) 

TextInputField = new TextInput(); 

TextInputField.tabEnabled=true;

TextInputField.focusEnabled = true;

TextInputField.styleName = this; 

TextInputField.width=textWidth; 

TextInputField.restrict="0-9";

TextInputField.text = formatNumberWithChar(_newvalue); 

TextInputField.parentDrawsFocus = true; 

TextInputField.setStyle("textAlign","right");

TextInputField.setStyle("borderStyle","solid"); 

TextInputField.setStyle("paddingLeft",0); 

TextInputField.setStyle("paddingRight",0); 

TextInputField.setStyle("paddingTop",0); 

TextInputField.setStyle("paddingBottom",0);

TextInputField.setStyle("horizontalGap",0); 

TextInputField.setStyle("borderThickness",0.5); 

TextInputField.setStyle("borderColor","#cccccc"); 

TextInputField.addEventListener(FocusEvent.FOCUS_OUT, inputField_focusOutHandler); 

this.addChild(TextInputField);

inputField=TextInputField;

 

/** * @private * * do for format number to string */

private function valueCommandHandler(event:FlexEvent):void{ 

//var v=this.value; 

inputField.text=formatNumberWithChar(value);

if(inputField==TextInputField){ 

this.newvalue=value; 

}

/** * @private * Remove the focus from the text field. */ 

override protected function focusInHandler(event:FocusEvent):void { 

super.focusInHandler(event);

var fm:IFocusManager = focusManager; if (fm) fm.defaultButtonEnabled = false; 

[Bindable] 

/** * The hours (an integer from 0 to 23) of the day. * * @default 0 */ 

public function get newvalue():Number { return _newvalue; }

[Inspectable(defaultValue=0,category="General",name="Hours")] 

public function set newvalue(val:Number):void { 

_newvalue = val;

this.invalidateProperties();

     //dispatchEvent(new Event("hoursChange"));

     //  dispatchEvent(new Event("change"));

override protected function commitProperties():void

{

super.commitProperties();

TextInputField.text = formatNumberWithChar(_newvalue);

}

/** * @private */ 

override public function set enabled(value:Boolean):void { 

_enabled = value;

if(TextInputField){ 

TextInputField.enabled=value; 

nextButton.enabled=value;

prevButton.enabled=value; 

/** * @private */ 

override public function get enabled():Boolean { 

return _enabled;

//把数字转换成字符的。

public  function formatNumberWithChar(value:Number):String

{

var len:Number=2;

var str:String=new String(value);//转换成String

   var arr:Array=super.stepSize.toString().split("\\.");

  if(arr.length>1){

  len= arr[1].toString().length;

  }

  str=value.toFixed(len);

return str;

}

/** * @private * Place the buttons to the right of the text field. */ 

override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void { 

super.updateDisplayList(unscaledWidth, unscaledHeight); 

var w:Number = nextButton.getExplicitOrMeasuredWidth(); 

var h:Number = Math.round(unscaledHeight / 2); 

var h2:Number = unscaledHeight - h; 

nextButton.x = unscaledWidth - w;

nextButton.y= 0; 

nextButton.setActualSize(w, h2);

prevButton.x = unscaledWidth - w; 

prevButton.y = unscaledHeight - h; 

prevButton.setActualSize(w, h); 

}

 /** * @private */

private function inputField_focusOutHandler(event:FocusEvent):void { 

inputField.text=formatNumberWithChar(Number(TextInputField.text));

if(inputField==TextInputField){ 

this.newvalue=value; 

}

focusOutHandler(event); 

// Send out a new FocusEvent because the TextInput eats the event 

// Make sure that it does not bubble

dispatchEvent(new FocusEvent(event.type, false, false, event.relatedObject, event.shiftKey,event.keyCode));

}

}

当你输入9的时候,你的stepsize 设置的0.01,那么就会显示9.00,当你输入9.236的时候,四舍五入为9.24.

你可能感兴趣的:(Flex)