2010-04-19 118 views
3

我正在写一个flex应用程序,它涉及非常频繁地修改textarea。我遇到了textarea的问题,有时不会显示我的修改。Flex textarea控件没有正确更新

以下ActionScript代码说明我的问题:

<?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框架的内部中认为这是某种同步问题。

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

回答

1

我的儿子在这种牙齿的事情上有一个粗糙的去,亨氏我清醒。并且,我真的不知道我是如何发生在这个随机问题/答案,因为我很少在stackoverflow ....但...

你不应该增加4倍的帧率,因为textarea的!我们正在谈论的系统资源,更不用提一个非常优雅的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。

有一个好, 杰里米

+0

非常感谢Jeremy!该代码现在可以在修改之后完美地工作,而无需增加帧速率。 增加帧速率后,我也意识到它并没有真正解决问题,但它有助于尽可能避免它。 – ielashi 2010-04-29 14:41:03

+0

没有问题。祝你好运。 – 2010-04-29 19:44:45

1

您正面临的问题似乎是在您输入文本的同时调用添加滚动条功能时,通过手动输入文本看起来它似乎缺少添加文本。虽然我不知道为什么。

我发现的解决方案似乎是为了确保framecript和计时器不符合(对于更快的文本输入,增加帧率)10ms定时器100fps似乎没有任何问题(添加frameRate="100"mx:Application线)工作。

+0

非常感谢你。它现在完美。 – ielashi 2010-04-20 14:38:36