添加新行时,如何以编程方式滚动到 Flex Spark Textarea 的末尾?

Posted

技术标签:

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

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

myMxTextArea.verticalScrollPosition = myMxTextArea.maxVerticalScrollPosition;

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

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

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

【问题讨论】:

【参考方案1】:

假设你有

<s:TextArea id="ta"   />

以下将起作用:

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"   />
</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 事件的监听器。这可能会妨碍某人打字,但在此用例中可能工作正常。

【讨论】:

为什么这被否决了?它对我来说很成功。

以上是关于添加新行时,如何以编程方式滚动到 Flex Spark Textarea 的末尾?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将 flex spark 数据组滚动到最大数量

以编程方式将新行添加到数据网格视图

如何以编程方式将垂直滚动条添加到组合框

当新行添加到 UITextView 实例中时,如何向上滚动视图?

iOS 以编程方式添加 UITextField 在编辑时不会将文本滚动到光标位置

在 Swift 中以编程方式添加时,UIScrollView 根本不滚动?