先在网上找了别人写的例子,下载后进行了修改。
主要是把 StringToolkit.formatNumberWithChar 揪出来了,这个东东在很多人的例子里都出现过,经过千辛万苦才揪出来。
一、组件:
<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:eshangrao="com.utils.*"
height="24" width="100%" fontSize="12" >
<mx:Script>
<![CDATA[
import mx.controls.DateField;
import com.utils.TimeInput;
[Bindable]
private var today:Date = new Date(new Date().setHours(0,0,0,0));
[Bindable]
private var start:Date = today;
[Bindable]
private var end:Date = start;
/*DateChange*/
private function onDateChangeHandler(event:Event):void
{
if(startDF.text == "")
{
startDF.selectedDate = start;
}
else
{
start = startDF.selectedDate;
}
}
// 获取值
public function getDateTimeValue():String
{
var strDate:String=startDF.text ;
var strHours:String=TimeInput.formatNumberWithChar(tInput.hours,2,"0");
var strMinutes:String=TimeInput.formatNumberWithChar(tInput.minutes,2,"0");
return strDate + " " +strHours +":" +strMinutes;
}
//设置值
public function setDateTimeValue(vNewValue:String,vConversion:Boolean=true):String
{
if (vNewValue.length==0) return "未赋值!";
if (vNewValue.length>15)
{
//取日期
var strYear:String=vNewValue.substr(0,4);
//从日期中取出月份
var numMonth:Number=parseInt(vNewValue.substr(5,2));
//从日期中取出天
var numDay:Number=parseInt(vNewValue.substr(8,2));
//取时
var numHours:Number=parseInt(vNewValue.substr(11,2));
//取分
var numMinutes:Number=parseInt(vNewValue.substr(14,2));
var strError:String="";
//判断月份是否超出范围
if (numMonth<1)
{
strError="月份应大于1月,输入值:" + numMonth;
numMonth=1;
}
if (numMonth>12)
{
strError="月份应小于12月,输入值:" + numMonth;
numMonth=12;
}
//判断天是否超出范围
if (numDay<1)
{
if (strError.length>0)
{
strError +="/n";
}
strError +="日期应大于1号,输入值:" + numDay;
numDay=1;
}
if (numDay>31)
{
if (strError.length>0)
{
strError +="/n";
}
strError +="日期应小于31号,输入值:" + numDay;
numDay=31;
}
//判断时是否超出范围
if (numHours<0)
{
if (strError.length>0)
{
strError +="/n";
}
strError +="小时应大于0点,输入值:" + numHours;
numHours=0;
}
if (numHours>23)
{
if (strError.length>0)
{
strError +="/n";
}
strError +="小时应小于23点,输入值:" + numHours;
numHours=23;
}
//判断分是否超出范围
if (numMinutes<0)
{
if (strError.length>0)
{
strError +="/n";
}
strError +="分钟应大于0分,输入值:" + numMinutes;
numMinutes=0;
}
if (numMinutes>59)
{
if (strError.length>0)
{
strError +="/n";
}
strError +="分钟应小于59分,输入值:" + numMinutes;
numMinutes=59;
}
//如果不强制转换,则输出错误信息
if(!vConversion && strError.length>0)
{
return strError;
}
var strDate:String=strYear + "-" + TimeInput.formatNumberWithChar(numMonth,2,"0")
+ "-" + TimeInput.formatNumberWithChar(numDay,2,"0");
startDF.text=strDate;
tInput.hours=numHours;
tInput.minutes=numMinutes;
return "";
}
else
{
return "参数错误,长度不够";
}
}
]]>
</mx:Script>
<mx:DateField id="startDF" x="0"
dayNames="[日,一,二,三,四,五,六]"
monthNames="[一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月]"
showToday="true" yearNavigationEnabled="true"
selectedDate="{start}" formatString="YYYY-MM-DD"
selectableRange="{{rangeEnd:end}}" change="onDateChangeHandler(event)" />
<eshangrao:TimeInput id="tInput" x="{startDF.width+2}"
hours="{new Date().getHours()}" minutes="{new Date().getMinutes()}"
toolTip="双击时间可手工进行输入!" />
<mx:Style>
toolTip{fontSize:12}
</mx:Style>
</mx:Canvas>
二、package file
package com.utils
{
import flash.events.Event;
import flash.events.FocusEvent;
import flash.text.TextLineMetrics;
import mx.containers.HBox;
import mx.controls.NumericStepper;
import mx.controls.Text;
import mx.controls.TextInput;
import mx.core.UITextField;
import mx.core.mx_internal;
import mx.events.FlexEvent;
import mx.managers.IFocusManager;
use namespace mx_internal;
[Event(name="change",type="flash.events.Event")]
[Event(name="hoursChange",type="flash.events.Event")]
[Event(name="minutesChange",type="flash.events.Event")]
public class TimeInput extends NumericStepper
{
public function TimeInput()
{
super();
this.maxChars=2;
this.minimum=0;
this.maximum=23;
this.stepSize=1;
this.addEventListener(FlexEvent.VALUE_COMMIT,valueCommandHandler);
}
protected var inputBox:HBox;
protected var sText:Text;
protected var hoursInputField:TextInput;
protected var minutesInputField:TextInput;
protected var _hours:Number = 0;
protected var _minutes:Number = 30;
protected var _timeDate:Date;
private var _enabled:Boolean=true;
override protected function createChildren():void
{
super.createChildren();
if(!inputBox)
{
inputBox=new HBox();
inputBox.setStyle("paddingLeft",0);
inputBox.setStyle("paddingRight",0);
inputBox.setStyle("paddingTop",0);
inputBox.setStyle("paddingBottom",0);
inputBox.setStyle("horizontalGap",0);
inputBox.setStyle("borderStyle","solid");
inputBox.setStyle("verticalAlign","middle");
addChild(inputBox);
}
var widestNumber:Number=61;
var lineMetrics:TextLineMetrics = measureText(widestNumber.toString());
var textWidth:Number = lineMetrics.width + UITextField.TEXT_WIDTH_PADDING+4;
if (!hoursInputField)
{
hoursInputField = new TextInput();
hoursInputField.focusEnabled = false;
hoursInputField.styleName = this;
hoursInputField.width=textWidth;
hoursInputField.restrict = "0-9";
hoursInputField.selectionBeginIndex=0;
hoursInputField.selectionEndIndex=1;
hoursInputField.maxChars = 2;
hoursInputField.text = formatNumberWithChar(_hours,2,"0");
hoursInputField.setStyle("textAlign","right");
hoursInputField.setStyle("borderStyle","none");
hoursInputField.setStyle("paddingLeft",0);
hoursInputField.setStyle("paddingRight",0);
hoursInputField.setStyle("paddingTop",0);
hoursInputField.setStyle("paddingBottom",0);
hoursInputField.setStyle("horizontalGap",0);
hoursInputField.addEventListener(FocusEvent.FOCUS_IN,inputField_focusInHandler);
hoursInputField.addEventListener(FocusEvent.FOCUS_OUT, inputField_focusOutHandler);
inputBox.addChild(hoursInputField);
}
inputField=hoursInputField;
if(!sText)
{
sText=new Text();
sText.text=":";
sText.setStyle("textAlign","center");
sText.setStyle("paddingLeft",0);
sText.setStyle("paddingRight",0);
sText.setStyle("paddingTop",0);
sText.setStyle("paddingBottom",0);
sText.setStyle("horizontalGap",0);
inputBox.addChild(sText);
}
if (!minutesInputField)
{
minutesInputField = new TextInput();
minutesInputField.focusEnabled = false;
minutesInputField.styleName = this;
minutesInputField.width=textWidth;
minutesInputField.restrict = "0-9";
minutesInputField.selectionBeginIndex=0;
minutesInputField.selectionEndIndex=1;
minutesInputField.maxChars = 2;
minutesInputField.text = formatNumberWithChar(_minutes,2,"0");
minutesInputField.setStyle("textAlign","left");
minutesInputField.setStyle("borderStyle","none");
minutesInputField.setStyle("paddingLeft",0);
minutesInputField.setStyle("paddingRight",0);
minutesInputField.setStyle("paddingTop",0);
minutesInputField.setStyle("paddingBottom",0);
minutesInputField.setStyle("horizontalGap",0);
minutesInputField.addEventListener(FocusEvent.FOCUS_IN,inputField_focusInHandler);
minutesInputField.addEventListener(FocusEvent.FOCUS_OUT, inputField_focusOutHandler);
inputBox.addChild(minutesInputField);
}
}
override protected function measure():void
{
super.measure();
var inputBoxHeight:Number = inputBox.getExplicitOrMeasuredHeight();
var buttonHeight:Number = prevButton.getExplicitOrMeasuredHeight() +
nextButton.getExplicitOrMeasuredHeight();
var h:Number = Math.max(inputBoxHeight, buttonHeight);
h = Math.max(DEFAULT_MEASURED_MIN_HEIGHT, h);
var inputBoxWidth:Number = inputBox.getExplicitOrMeasuredWidth();
var buttonWidth:Number = Math.max(prevButton.getExplicitOrMeasuredWidth(),
nextButton.getExplicitOrMeasuredWidth());
var w:Number = inputBoxWidth + buttonWidth;
w = Math.max(DEFAULT_MEASURED_MIN_WIDTH, w);
measuredMinWidth = DEFAULT_MEASURED_MIN_WIDTH;
measuredMinHeight = DEFAULT_MEASURED_MIN_HEIGHT;
measuredWidth = w;
measuredHeight = h;
}
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);
var inputBoxHeight:Number = inputBox.getExplicitOrMeasuredHeight();
var inputBoxWidth:Number = inputBox.getExplicitOrMeasuredWidth();
inputBox.setActualSize(inputBoxWidth,inputBoxHeight);
}
private function inputField_focusInHandler(event:FocusEvent):void
{
inputField=event.currentTarget as TextInput;
if(event.currentTarget as TextInput == hoursInputField)
{
this.value=parseInt(inputField.text);
this.minimum=0;
this.maximum=23;
}
else
{
this.value=parseInt(inputField.text);
this.minimum=0;
this.maximum=59;
}
focusInHandler(event);
dispatchEvent(new FocusEvent(event.type, false, false,
event.relatedObject,
event.shiftKey, event.keyCode));
}
private function inputField_focusOutHandler(event:FocusEvent):void
{
focusOutHandler(event);
dispatchEvent(new FocusEvent(event.type, false, false,
event.relatedObject,
event.shiftKey,event.keyCode));
}
private function valueCommandHandler(event:FlexEvent):void
{
inputField.text=formatNumberWithChar(value,2,"0");
if(inputField==hoursInputField)
{
this.hours=value;
}
else
{
this.minutes=value;
}
}
override protected function focusInHandler(event:FocusEvent):void
{
super.focusInHandler(event);
var fm:IFocusManager = focusManager;
if (fm)
fm.defaultButtonEnabled = false;
}
[Bindable]
public function get hours():Number
{
return _hours;
}
[Inspectable(defaultValue=0,category="Time",name="Hours")]
public function set hours(val:Number):void
{
if (val >= 0 || val <= 24)
{
this._hours = val;
if(inputField==hoursInputField && val!=value)
value=val;
else{
hoursInputField.text=formatNumberWithChar(val,2,"0");
}
}
dispatchEvent(new Event("hoursChange"));
dispatchEvent(new Event("change"));
}
[Bindable]
public function get minutes():Number
{
return _minutes;
}
[Inspectable(defaultValue=30,category="Time",name="Minutes")]
public function set minutes(val:Number):void
{
if (val >= 0 || val <= 59)
{
this._minutes = val;
if(inputField==minutesInputField && val!=value)
value=val;
else{
minutesInputField.text=formatNumberWithChar(val,2,"0");
}
}
dispatchEvent(new Event("minutesChange"));
dispatchEvent(new Event("change"));
}
public function get Time():Date
{
var date:Date=new Date();
date.hours=_hours;
date.minutes=_minutes;
return date;
}
public function set Time(time:Date):void
{
this._timeDate=time;
this.hours=time.hours;
this.minutes=time.minutes;
}
override public function set enabled(value:Boolean):void
{
_enabled = value;
if(hoursInputField){
hoursInputField.enabled=value;
minutesInputField.enabled=value;
sText.enabled=value;
nextButton.enabled=value;
prevButton.enabled=value;
}
}
override public function get enabled():Boolean
{
return _enabled;
}
public static function formatNumberWithChar(value:Number,length:int=2,pref:String="0"):String
{
var str:String=new String(value);
var len:int=str.length;
if(len>length)
return str.substr(0,length);
else
{
var n:int=length-len;
for(var i:int=0;i<n;i++)
{
str=pref+str;
}
return str;
}
}
}
}