Как получить координаты X, Y каретки внутри компонента TextArea? - PullRequest
2 голосов
/ 04 марта 2011

Я почти день гуглил, чтобы найти ответ на свой вопрос, и нашел здесь ответ по polygeek:

http://polygeek.com/1826_flex_monitoring-the-position-of-the-cursor-in-a-textarea

Это почти работает (и является отличным решением), но решение не работает, когда я делаю: 1).копировать и вставлять многострочные тексты 2).пишите долго и прокручивайте тексты.

Я также нашел другой рабочий пример по адресу: http://www.victordramba.com/?p=31 (приглашение автозаполнения появляется, когда вы нажимаете ctrl + пробел прямо в позиции каретки) Но письмо от его автора(Виктор Драмба) говорит, что он использует монотипные шрифты для вычисления местоположения отдельного персонажа, и это мало чем поможет.

Есть ли способ получить многострочный ввод из текстового поля?

Ответы [ 2 ]

3 голосов
/ 04 марта 2011

Я написал этот класс Helper, который решает вашу проблему (если вы используете Flex 4):

</p> <pre><code>public class TextAreaHelper { public static function getCaretPosition(ta : TextArea) : Point { var flowComposer : StandardFlowComposer = StandardFlowComposer(ta.textFlow.flowComposer); var absoluteIndex : int = ta.selectionActivePosition; var lineIdx : int = flowComposer.findLineIndexAtPosition(absoluteIndex); if (lineIdx == flowComposer.numLines) lineIdx--; var prevLine : TextFlowLine = lineIdx != 0 ? flowComposer.getLineAt(lineIdx - 1) : null; var nextLine : TextFlowLine = lineIdx != flowComposer.numLines-1 ? flowComposer.getLineAt(lineIdx + 1) : null var result : Rectangle = flowComposer.getLineAt(lineIdx).computePointSelectionRectangle(absoluteIndex, ta, prevLine, nextLine, true); if (result) { var point : Point = new Point(result.x, result.y); point.x -= ta.scroller.viewport.horizontalScrollPosition; point.y -= ta.scroller.viewport.verticalScrollPosition; return point; } return null; } }

Вот пример использования:

</p> <pre><code>:<fx:Script> <![CDATA[ [Bindable] private var caretPosition : Point; private function textareaSelectionChangeHandler(e : FlexEvent) : void { updateCaretPosition(); } private function onPossibleScrollPositionChange(e : PropertyChangeEvent) : void { if (["verticalScrollPosition", "horizontalScrollPosition"].indexOf(e.property) != -1) { updateCaretPosition(); } } private function updateCaretPosition() : void { caretPosition = TextAreaHelper.getCaretPosition(ta); if (caretPosition) caretPosition = ta.localToGlobal(caretPosition); trace(ObjectUtil.toString(caretPosition)); } private function initTextArea() : void { ta.addEventListener(FlexEvent.SELECTION_CHANGE, textareaSelectionChangeHandler); ta.textDisplay.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, onPossibleScrollPositionChange); } ]]> </fx:Script> <s:TextArea x="200" y="300" id="ta" creationComplete="initTextArea()" /> <s:Rect x="{caretPosition.x}" y="{caretPosition.y}" width="10" height="10" visible="{caretPosition != null}"> <s:fill> <s:SolidColor color="yellow" /> </s:fill> </s:Rect>

1 голос
/ 18 июня 2012

Это единственный способ, символы табуляции помечаются как один символ ...

public class TextAreaEx extends TextArea 
{       
    ...     

        public function getCaretPosition() : Point
        {
            var pos : int = selectionActivePosition;
            var tx:String = text;
            var p:Point = new Point(pos+1, 1);
            for(var i:int=pos-1; i>0; i--) 
            {
                if (tx.charAt(i) == '\n') 
                {
                    if (p.y==1)
                        p.x = pos-i;
                    p.y++;
                }
            }
            return p;
        }       

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...