用了几个小时终于搞定
现将代码贴上,
<?xml version="1.0" encoding="utf-8"?>
<mx:DateChooser xmlns:mx="http://www.adobe.com/2006/mxml" width="245" height="190" creationComplete="onCreationComplete()">
<mx:Script>
<![CDATA[
import mx.controls.Button;
import mx.controls.Alert;
import mx.events.DateChooserEventDetail;
import mx.events.DateChooserEvent;
import mx.events.CalendarLayoutChangeEvent;
[Bindable]
public var arYears:Array = [];
/**
* onCreationComplete
*
* @access public
* @param void
* @return void
*/
public function onCreationComplete() : void
{
this.arYears = [];
for(var i:int = 1900;i < 2301;i ++)
this.arYears.push(i.toString());
setChange();
}
public function setChange() : void
{
try
{
var currentDate : Date = this.selectedDate == null?new Date():this.selectedDate;
// simple init
this.months.selectedIndex = currentDate.getMonth();
this.years.selectedItem = currentDate.getFullYear().toString();
}catch(e:Error){}
}
public override function set selectedDate(value:Date):void
{
try
{
super.selectedDate=value;
setChange();
}catch(e:Error){}
}
protected override function createChildren():void
{
try
{
super.createChildren();
addChild(months);
addChild(years);
this.addEventListener(DateChooserEvent.SCROLL, onChangeMonth);
this.addEventListener(CalendarLayoutChangeEvent.CHANGE, dateGrid_changeHandler);
// this.addEventListener(CalendarLayoutChangeEvent.CHANGE, dateGrid_changeHandler);
}catch(e:Error){}
}
private function dateGrid_changeHandler(event:CalendarLayoutChangeEvent):void
{
setChange();
}
/**
* onChangeMonth
*
* @access private
* @param DateChooserEvent
* @return void
*/
public function onChangeMonth( event : DateChooserEvent ) : void
{
if (event.detail == DateChooserEventDetail.NEXT_MONTH)
this.months.selectedIndex++;
if (event.detail == DateChooserEventDetail.PREVIOUS_MONTH)
this.months.selectedIndex--;
//mx.controls.Alert.show((event.triggerEvent.currentTarget as Button).id.toString());
if (event.detail == DateChooserEventDetail.PREVIOUS_YEAR) {
this.months.selectedIndex = 11;
this.years.selectedIndex--;
}
if (event.detail == DateChooserEventDetail.NEXT_YEAR) {
this.months.selectedIndex = 0;
this.years.selectedIndex++;
}
}
/**
* onChangeDropDownMonth
*
* @access private
* @param Event event
* @return void
*/
private function onChangeDropDownMonth( event : Event ) : void
{
this.displayedMonth = (this.months.selectedIndex as Number);
}
/**
* onChangeDropDownYears
*
* @access private
* @param Event event
* @return void
*/
private function onChangeDropDownYears( event : Event ) : void
{
this.displayedYear = this.years.selectedItem.toString();
}
]]>
</mx:Script>
<!--mx:DateChooser id="calend" name="calendar" width="245" height="190" /-->
<mx:ComboBox id="months" x="26" y="15" width="105" change="onChangeDropDownMonth(event)">
<mx:ArrayCollection>
['一月','二月','三月','四月','五月','六月','七月','八月','九月','十月','十一月','十二月']
</mx:ArrayCollection>
</mx:ComboBox>
<mx:ComboBox id="years" x="155" y="15" width="75" change="onChangeDropDownYears(event);">
<mx:ArrayCollection source="{arYears}"/>
</mx:ComboBox>
</mx:DateChooser>
package app.lib.components
{
import flash.system.IME;
import mx.controls.DateField;
import mx.core.ClassFactory;
import mx.events.DateChooserEvent;
public class MyDateField extends DateField
{
public var chooser:calendar;
public function MyDateField()
{
super();
this.formatString="YYYY年MM月DD";
this.yearNavigationEnabled = false;
this.firstDayOfWeek=1;
this.dayNames=["日","一","二","三","四","五","六"];
this.monthNames=["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"];
this.dropdownFactory=new ClassFactory(calendar);
this.addEventListener("focusIn",function():void{IME.enabled=false;});
this.addEventListener("focusOut",function():void{IME.enabled=true;focusOutDateField()});
this.addEventListener("change",onChangeMonth);
}
public function onChangeMonth( ) : void
{
this.dropdown.selectedDate = this.selectedDate;
}
[Bindable]
public var startDate:Date;
[Bindable]
public var endDate:Date;
public var dateFlg:Boolean;
private function focusOutDateField():void{
if(this.text != ""&&this.text !=null){
dateFlg = true;
this.text = replaceAll(this.text);//Y年MM月DD日
//this.text = replaceAll(this.text,"-");
this.text = replaceAll(this.text,"年");
this.text = replaceAll(this.text,"月");
this.text = replaceAll(this.text,"日");
// this.text = replaceAll(this.text,"\");
var yearMy:Number = Number(this.text.substr(0,4));
var monthMy:Number = Number(this.text.substr(4,2));
var dayMy:Number = Number(this.text.substr(6,2));
var yearStr:String = this.text.substr(0,4);
var monthStr:String = this.text.substr(4,2);
var dayStr:String = this.text.substr(6,2);
if(yearMy > 2300){
yearStr = '2300';
yearMy = 2300;
dateFlg = false;
}
if(yearMy < 1900){
yearStr = '1900';
yearMy = 1900;
dateFlg = false;
}
var bool:Boolean = ((yearMy%4 == 0) && (yearMy%100 != 0)) || (yearMy%400 == 0) ? true : false;
if(monthMy < 1 || monthMy > 12){
monthStr = '01';
monthMy = 1;
dateFlg = false;
}else if(monthMy < 10){
monthStr = "0" + monthMy;
}
if(dayMy >= 1 && dayMy < 10){
dayStr = "0" + dayMy;
}
switch(monthMy){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if(dayMy < 1 || dayMy > 31 ){
dayStr = '01';
dateFlg = false;
}
break;
case 4:
case 6:
case 9:
case 11:
if(dayMy < 1 || dayMy > 30 ){
dayStr = '01';
dateFlg = false;
}
break;
case 2:
if(bool){
if(dayMy < 1 || dayMy > 29){
dayStr = '01';
dateFlg = false;
}
}else{
if(dayMy < 1 || dayMy > 28){
dayStr = '01';
dateFlg = false;
}
}
break;
}
if(dayStr == ""){
dayStr = "01";
dateFlg = false;
}
this.text = yearStr + monthStr + dayStr;
if(this.text.length == 8){
textSub();
}
}
}
private function textSub():void{
/* if(!dateFlg){
this.selectedDate = null;
this.text = null;
this.startDate = null;
this.endDate = null;
}
else
{*/
var myDate:Date = new Date();
myDate.setFullYear(Number(this.text.substr(0,4)),Number(this.text.substr(4,2))-1,Number(this.text.substr(6,2)) );
this.selectedDate = myDate;
this.text = this.text.substr(0,4) + "年" + this.text.substr(4,2) + "月" + this.text.substr(6,2);
// }
}
private function replaceAll(str:String,match:String="-"):String
{
while(str.search(match) != -1)
{
str = str.replace(match,"");
}
return str;
}
}
}
示例:跟DateField用法一样,最好给个 selectedDate
<components:MyDateField selectedDate="{new Date()}" editable="false" yearNavigationEnabled="false" />