2010-04-19 113 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