Flex textarea控件无法正确更新

时间:2010-04-19 18:25:23

标签: flex actionscript-3 actionscript flex3

我正在编写一个涉及非常频繁地修改textarea的flex应用程序。我遇到过textarea的问题,有时候没有显示我的修改。

以下动作脚本代码说明了我的问题:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" minWidth="955" minHeight="600">
    <mx:TextArea x="82" y="36" width="354" height="291" id="textArea" creationComplete="initApp()"/>

    <mx:Script>
        <![CDATA[
            private var testSentence:String = "The big brown fox jumps over the lazy dog.";

            private var testCounter:int = 0;

            private function initApp():void {
                var timer:Timer = new Timer(10);
                timer.addEventListener(TimerEvent.TIMER, playSentence);
                timer.start();
            }

            private function playSentence(event:TimerEvent):void {
                textArea.editable = false;

                if (testCounter == testSentence.length)  {
                    testCounter = 0;
                    textArea.text += "\n";
                }
                else {
                    textArea.text += testSentence.charAt(testCounter++);
                }

                textArea.editable = true;
            }
        ]]>
    </mx:Script>
</mx:Application>

当你在flex项目中运行上面的代码时,它应该逐个字符地重复打印“大棕狐跳过懒狗”这句话。但是,如果您同时在textarea中输入,您会注意到计时器打印的文本是扭曲的。

我真的很好奇为什么会这样。当我进行修改时,flex的单线程特性和禁用textarea的用户输入可以防止这种情况发生,但由于某种原因,这似乎不起作用。

我必须注意的是,当以更大的间隔(大约100ms)运行计时器时,它看起来工作得很好,所以我很想在flex框架的内部认为它是某种同步问题。

关于可能导致问题的任何想法?

2 个答案:

答案 0 :(得分:1)

您所面临的问题似乎是在您输入文本的同时调用添加自动收录功能时,通过手动输入文本,似乎缺少添加文本。虽然我不确定为什么。

我找到的解决方案似乎是确保framecript和timer不符合(对于更快的文本输入,增加帧速率)10ms计时器100fps似乎没有任何问题(将frameRate="100"添加到{ {1}}行)。

答案 1 :(得分:1)

我的儿子正在粗暴地看着这个出牙的事情,我醒来了。而且,我不确定我是如何在这个随机的问题/答案上发生的,因为我很少在stackoverflow上......但是......

由于textArea,您不必将帧速率提高4倍!我们讨论的是系统资源,更不用说一个非常优雅的Flex框架,你可以改为利用它:

这是一个非常快速且符合flex-sdk标准的快乐解决方案:

创建一个扩展TextArea的组件并添加以下属性并覆盖(如果这实际上是你想要做的):

private var _tackOnText : String = "";
private var _tackOnTextChanged : Boolean = false;
public function set tackOnText(value:String):void
{
    _tackOnText = value;
    _tackOnTextChanged = true;
    invalidateProperties();
}

public function get tackOnText():String
{
    return _tackOnText;
}


override protected function commitProperties():void
{
    super.commitProperties();

    if(_tackOnTextChanged) {
        this.textField.text += _tackOnText;
        _tackOnText = "";
        _tackOnTextChanged = false;
    }

}

然后改变你的playSentence来做到这一点:

if (testCounter == testSentence.length)  {
    testCounter = 0;
    textArea.tackOnText += "\n";
}
else {
    textArea.tackOnText += testSentence.charAt(testCounter++);
}

这是针对半常见问题的一个修复,应该允许您不要将frameRate增加4倍以使您的应用程序正常运行并且您将更好地使用flex sdk。

我的2p。

有一个好的, 杰里米