Flex textarea control не обновляется должным образом - PullRequest
3 голосов
/ 19 апреля 2010

Я пишу гибкое приложение, которое очень часто изменяет текстовую область. У меня возникли проблемы с текстовой областью, иногда не отображающей мои модификации.

Следующий код 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, он должен многократно выводить символ за символом фразу «Большая коричневая лиса перепрыгивает через ленивую собаку». Но если вы набираете текстовую область одновременно, вы заметите, что текст, который печатает таймер, искажен.

Мне действительно любопытно, почему это происходит. Однопоточная природа flex и отключение пользовательского ввода для текстовой области, когда я делаю изменения, должны предотвратить это, но по некоторым причинам это, похоже, не работает.

Я также должен отметить, что при работе таймера с большими интервалами (около 100 мс) он, кажется, работает идеально, поэтому я испытываю желание подумать, что это какая-то проблема синхронизации во внутренних компонентах гибкой платформы.

Есть идеи о том, что может быть причиной проблемы?

Ответы [ 2 ]

1 голос
/ 28 апреля 2010

Моему сыну не по зубам этот зуб, потому что я не сплю. И, я не совсем уверен, как я столкнулся с этим случайным вопросом / ответом, так как я очень редко на стеке потока ... но ...

Вы НЕ ДОЛЖНЫ увеличивать частоту кадров в 4 раза из-за текстовой области! Мы говорим о системных ресурсах, не говоря уже об очень элегантной гибкой инфраструктуре, которую вы могли бы вместо этого использовать:

Вот очень быстрое и гибкое 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.

Мой 2р.

Хорошего вам, Джереми

1 голос
/ 20 апреля 2010

Проблема, с которой вы сталкиваетесь, возникает, когда функция тикера вызова вызывается в то время, когда вы вводите текст, при вводе текста вручную создается впечатление, что в этом случае добавление текста пропускается. хотя я не уверен почему.

Решение, которое я нашел, похоже, состоит в том, чтобы убедиться, что кадровый скрипт и таймер не соответствуют (для более быстрого ввода текста увеличьте частоту кадров) для таймера 10 мс 100fps, кажется, работает без проблем (добавьте frameRate="100" к mx:Application линия).

...