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.