如何在flex中创建文本步进控件?

我需要Flex 3中的一个控件,就像NumericStepper,但它可以显示任意字符串。这种控制存在吗?如果没有,您对创建它的建议是什么,或者您推荐的参考文献? 为方便起见,我称之为TextStepper。我希望这是一种紧凑的方式来显示用户可以通过单击向上/向下按钮循环的字符串选项列表。紧凑意味着控件没有下拉或弹出方面:更改所选索引的唯一方法是单击向上/向下按钮(更新文本输入值)。值循环意味着我真的想将底层dataProvider视为循环缓冲区。所以上/下点击以模数方式修改selectedIndex。     
已邀请:
想法是使用
valueFormatFunction
<?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" minWidth="955" minHeight="600" xmlns:local="*">

    <local:StringStepper horizontalCenter="0" verticalCenter="0" width="200">
        <local:dataProvider>
            <s:ArrayCollection>
                <fx:String>Hello!</fx:String>
                <fx:String>I love you.</fx:String>
                <fx:String>Won't you tell me your name?</fx:String>
            </s:ArrayCollection>
        </local:dataProvider>
    </local:StringStepper>

</s:Application>
StringStepper的来源:
package
{
import mx.collections.ArrayCollection;
import mx.events.CollectionEvent;

import spark.components.NumericStepper;

public class StringStepper extends NumericStepper
{
    public function StringStepper()
    {
        enabled = false;
        valueFormatFunction = defaultValueFormatFunction;
        valueParseFunction = defaultValueParseFunction;
    }

    private var _dataProvider:ArrayCollection;

    public function get dataProvider():ArrayCollection
    {
        return _dataProvider;
    }

    public function set dataProvider(value:ArrayCollection):void
    {
        if (_dataProvider == value)
            return;

        if (_dataProvider)
            _dataProvider.removeEventListener(CollectionEvent.COLLECTION_CHANGE,
                dataProvider_collectionChangeHandler);

        _dataProvider = value;
        commitDataProvider();

        if (_dataProvider)
            _dataProvider.addEventListener(CollectionEvent.COLLECTION_CHANGE,
                dataProvider_collectionChangeHandler);
    }

    /**
     * Same event as for <code>value</code>.
     */
    [Bindable("valueCommit")]
    public function get selectedItem():Object
    {
        return _dataProvider && value <= _dataProvider.length - 1 ? _dataProvider[value] : null; 
    }

    public function set selectedItem(value:Object):void
    {
        if (!_dataProvider)
            return;

        value = _dataProvider.getItemIndex(value);
    }

    private function defaultValueFormatFunction(value:Number):String
    {
        return _dataProvider && value <= _dataProvider.length - 1 ? _dataProvider[value] : String(value);
    }

    private function defaultValueParseFunction(value:String):Number
    {
        if (!_dataProvider)
            return 0;

        var n:int = _dataProvider.length;
        for (var i:int = 0; i < n; i++)
        {
            var string:String = _dataProvider[i];
            if (string == value)
                return i;
        }
        return 0;
    }

    private function commitDataProvider():void
    {
        if (!_dataProvider)
        {
            minimum = 0;
            maximum = 0;
            enabled = false;
            return;
        }

        enabled = true;
        minimum = 0;
        maximum = _dataProvider.length - 1;
    }

    private function dataProvider_collectionChangeHandler(event:CollectionEvent):void
    {
        commitDataProvider();
    }

}
}
    
我通过在
NumericStepper
(绝对定位)上覆盖
TextInput
来创建其中一个(作为MXML组合),以便
TextInput
覆盖
NumericStepper
的输入部分。 dataProvider是一个
ArrayCollection
的字符串,并且
NumericStepper
的值用于访问ArrayCollection中的索引。
NumericStepper
的更改事件将
TextInput
的文本更改为dataProvider的索引n处的任何内容。我给组件一个可编辑的属性,它将
TextInput
设置为可编辑,并将新字符串插入到当前索引的dataProvider中。     

要回复问题请先登录注册