【问题标题】:How do I programmatically scroll to the end of a Flex Spark Textarea when a new line is added?添加新行时,如何以编程方式滚动到 Flex Spark Textarea 的末尾?
【发布时间】:2011-11-11 10:42:54
【问题描述】:

mx:TextArea 的旧方法不再有效。具体来说:

myMxTextArea.verticalScrollPosition = myMxTextArea.maxVerticalScrollPosition;

我为 Spark 找到了这种方法,但似乎有点笨拙:

mySparkTA.scrollToRange(mySparkTA.text.length-1, mySparkTA.text.length);

有没有更直接的方法来做到这一点?

【问题讨论】:

    标签: apache-flex textarea


    【解决方案1】:

    假设你有

    <s:TextArea id="ta" width="100%" height="100%" />
    

    以下将起作用:

    ta.scroller.verticalScrollBar.value = ta.scroller.verticalScrollBar.maximum;
    

    无需将 TextArea 包装在 Scroller 组件中。

    【讨论】:

    • 不要忘记 validateNow() 否则 UI 可能会刷新
    【解决方案2】:

    这就是你使用 spark textarea 的方法,但你总是可以尝试将它包装在一个 Scroller 组件中,而不用让 textarea 本身为滚动而烦恼:

    <s:Scroller id="scroller">
       <s:TextArea id="ta" width="100%" height="100%" />
    </s:Scroller>
    

    然后在 AS 中这样做:

    scroller.verticalScrollBar.value = scroller.verticalScrollBar.maximum;
    

    没有其他简单的方法可以做到这一点。

    【讨论】:

    • 谢谢。这可能在某一时刻有效,但在最新的 SDK 4.6 中我收到此错误,“'spark.components.TextArea' 不可分配给'spark.core.IViewport' 类型的默认属性'viewport'。”另外,你在什么事件上调用 AS 代码?
    • 是的,它可能不再起作用了。您需要用 Group 或其他东西包装 TextArea。我不太清楚你在哪个事件上调用它是什么意思...
    【解决方案3】:

    spark TextArea 有一个“appendText”方法 这会附加文本并自动向下滚动到添加的行..

    【讨论】:

      【解决方案4】:
      <s:TextArea id="consoleTextArea" 
                  change="consoleTextArea_changeHandler(event)"
                  valueCommit="consoleTextArea_valueCommitHandler(event)"
                  updateComplete="scrollToTheBottom()"
                  />
      

      然后在 ActionScript 中:

              protected function consoleTextArea_valueCommitHandler(event:FlexEvent):void {
                  scrollToTheBottom();
              }
      
              protected function consoleTextArea_changeHandler(event:TextOperationEvent):void {
                  scrollToTheBottom()
              }
      
              public function scrollToTheBottom():void {
                  var scrollBar:VScrollBar = consoleTextArea.scroller.verticalScrollBar;
                  scrollBar.value = scrollBar.maximum;
                  consoleTextArea.validateNow();
      
                  if (scrollBar.value != scrollBar.maximum) {
                      scrollBar.value = scrollBar.maximum;
                      consoleTextArea.validateNow();
                  }
              }
      

      您可能需要将 if 语句放入循环中进行几次迭代,或者直到值匹配或接近最大值。

      更新:添加了 updateComplete 事件的监听器。这可能会妨碍某人打字,但在此用例中可能工作正常。

      【讨论】:

      • 为什么这被否决了?它对我来说很成功。
      猜你喜欢
      • 2017-09-15
      • 2010-10-04
      • 1970-01-01
      • 2012-05-05
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多