In a previous example, “Auto-scrolling a TextArea control in Flex”, we saw how you could auto-scroll a Flex Halo TextArea control when new content is added by setting the verticalScrollPosition property to the value of the maxVerticalScrollPosition property.

The following example shows how you can auto-scroll a Flex 4 Spark TextArea control using the appendText() method.

Full code after the jump.

The following example(s) require Flash Player 10 and the Adobe Flex 4 SDK. To download the Adobe Flash Builder 4 trial, see http://www.adobe.com/products/flex/. To download the latest nightly build of the Flex 4 SDK, see http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+4.
For more information on getting started with Flex 4 and Flash Builder 4, see the official Adobe Flex Team blog.

<?xml version="1.0" encoding="utf-8"?>
<!-- http://blog.flexexamples.com/2009/08/03/auto-scrolling-a-spark-textarea-control-in-flex-4/ -->
<s:Application name="Spark_TextArea_appendText_test"
               xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/halo"
               creationComplete="init();">
 
    <fx:Script>
        <![CDATA[
            private var timer:Timer;
 
            private function init():void {
                timer = new Timer(500);
                timer.addEventListener(TimerEvent.TIMER, onTimer);
                timer.start();
            }
 
            private function onTimer(evt:TimerEvent):void {
                var now:String = new Date().toTimeString();
                var str:String = "[" + timer.currentCount + "] " + now;
                textArea.appendText(str + "\n");
            }
        ]]>
    </fx:Script>
 
    <s:TextArea id="textArea"
            verticalScrollPolicy="on"
            horizontalCenter="0"
            verticalCenter="0" />
 
</s:Application>

View source is enabled in the following example.

This entry is based on a beta version of the Flex 4 SDK and therefore is very likely to change as development of the Flex SDK continues. The API can (and will) change causing examples to possibly not compile in newer versions of the Flex 4 SDK.

 
Tagged with:
 
About The Author

Peter deHaan

Peter deHaan currently works for Adobe on the Flex SDK QA team. While not working on Flex, Flash, and ColdFusion applications, Peter enjoys making up bios and writing in 3rd person. Peter's rarely updated blog can be found at blogs.adobe.com/pdehaan/, actionscriptexamples.com, airexamples.com, and coldfusionexamples.com.

6 Responses to Auto-scrolling a Spark TextArea control in Flex 4

  1. Brian says:

    This works for TextArea, but how do you handle manual scrolling? How do you find the vertical scroll position and max scroll position values?

  2. myIP says:

    Have you noticed that this example accumulates memory? It crashes Firefox after a few minutes of running.

    • Peter deHaan says:

      @myIP,

      I tried running the SWF above in my IE8 and FF3.5.5 on Windows XP and I couldn’t reproduce any crashing in either browser.
      I see some very minor memory accumulation, but that may be explained away by the fact I’m adding new text to the TextArea control 2x/second.

      Peter

  3. Anonymous says:

    All this demonstrates is that the spark control appends text and automatically keeps the last line in view.
    The title is a little misleading – I was expecting examples of programmatic control.

    • Peter deHaan says:

      @Anonymous,

      Yeah, I’ll buy that — looking back it was a poor blog title. And to make it up to you, I’ll post an example of programmatically changing the horizontal and vetical scroll position on the Spark TextArea control. In fact, here’s a preview:

      <?xml version="1.0" encoding="utf-8"?>
      <s:Application name="Spark_TextArea_verticalScrollBar_value_test"
              xmlns:fx="http://ns.adobe.com/mxml/2009"
              xmlns:s="library://ns.adobe.com/flex/spark"
              xmlns:mx="library://ns.adobe.com/flex/mx">
          <s:controlBarContent>
              <mx:Form>
                  <mx:FormItem label="scroll horizontally:">
                      <s:HSlider id="hSl" minimum="0" change="hSl_changeHandler(event);" />
                  </mx:FormItem>
                  <mx:FormItem label="scroll vertically:">
                      <s:HSlider id="vSl" minimum="0" change="vSl_changeHandler(event);" />
                  </mx:FormItem>
              </mx:Form>
          </s:controlBarContent>
       
          <fx:Script>
              <![CDATA[
                  import mx.events.FlexEvent;
       
                  protected function ta_updateCompleteHandler(evt:FlexEvent):void {
                      hSl.maximum = ta.scroller.horizontalScrollBar.maximum;
                      vSl.maximum = ta.scroller.verticalScrollBar.maximum;
                  }
       
                  protected function hSl_changeHandler(evt:Event):void {
                      ta.scroller.horizontalScrollBar.value = hSl.value;
                  }
       
                  protected function vSl_changeHandler(evt:Event):void {
                      ta.scroller.verticalScrollBar.value = vSl.value;
                  }
              ]]>
          </fx:Script>
       
          <s:TextArea id="ta"
                      widthInChars="20" heightInLines="5"
                      lineBreak="explicit"
                      horizontalCenter="0" verticalCenter="0"
                      updateComplete="ta_updateCompleteHandler(event)">
              <s:textFlow>
                  <s:TextFlow>
                      <s:p>1234567890123456789012345678901234567890</s:p>
                      <s:p>2345678901234567890123456789012345678901</s:p>
                      <s:p>3456789012345678901234567890123456789012</s:p>
                      <s:p>4567890123456789012345678901234567890123</s:p>
                      <s:p>5678901234567890123456789012345678901234</s:p>
                      <s:p>6789012345678901234567890123456789012345</s:p>
                      <s:p>7890123456789012345678901234567890123456</s:p>
                      <s:p>8901234567890123456789012345678901234567</s:p>
                      <s:p>9012345678901234567890123456789012345678</s:p>
                      <s:p>0123456789012345678901234567890123456789</s:p>
                  </s:TextFlow>
              </s:textFlow>
          </s:TextArea>
       
      </s:Application>

      Peter

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">

Anti-Spam Protection by WP-SpamFree