Как прокрутить текстовую область GWT? - PullRequest
4 голосов
/ 09 марта 2010

Я звоню com.google.gwt.user.client.ui.TextArea.setText(myText), чтобы установить контент. После этого я вызываю setCursorPosition(myText.length()), чтобы получить курсор до конца. Это хорошо работает.

Если myText содержит больше строк, чем может отображаться текстовая область, отображается полоса прокрутки. Но он не прокручивается до позиции курсора. Еще хуже - он прокручивается наверх.

Как прокрутить текстовую область GWT в положение курсора? Мне действительно нужна позиция курсора, а не нижняя часть TextArea. Обходной путь JSNI тоже подойдет.

Ответы [ 4 ]

3 голосов
/ 13 апреля 2011

У меня был сценарий, когда текстовая область уже будет иметь что-то, и когда будет отправлена ​​новая команда, она добавит к ней данные и прокрутит до начала вновь добавленных данных. это то, что я сделал

    // Hold the previous height to set the scroll.
    final int prevHeight = document.get().getElementById(textareadid).getScrollHeight();
    // Hold the prev position if output area already has some data.
    final int prevPos = this.textArea.getValue() != null ?  
    this.textArea.getValue().length() : 0;

после обработки и установки новых данных

        int posCount = 0;
        if (previousResponse != null && !previousResponse.isEmpty())
        {
            final String dataStr = "new data from process";
            // add 15 lines for the cursor position
            posCount = getRelativeCount(dataStr);
        }
        this.textArea.getElement().setScrollTop(prevHeight);
        this.textArea.setCursorPos(prevPos + posCount);

 private int getRelativeCount(final String str)
{
    int charCount = 0;

    if (str != null)
    {

        int NUM_ROWS = 15;

        if (getUserAgent().contains("msie"))
        {
            NUM_ROWS = 16;
        }

        final String[] splitArr = str.split("\n"); // split on the new line
                                                   // char

        for (int index = 0; index < splitArr.length && index < NUM_ROWS; index++)
        {
            charCount += splitArr[index].length();
        }
    }
    return charCount;
}
3 голосов
/ 10 марта 2010

Попробуйте добавить это после установки позиции курсора:

textAreaToScroll.getElement().setScrollTop(textAreaToScroll.getElement().getScrollHeight());

Это позволит прокрутить элемент вниз.

EDIT:

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

int cursorPos = textAreaToScroll.getCursorPos();
long offsetRatio = cursorPos / textAreaToScroll.getText().length(); 
//gives 0.0 to 1.0
offsetRatio += someMagicNumber; // -0.1 maybe?
// Depending on the font you may need to adjust the magic number
// to adjust the ratio if it scrolls to far or to short.
offsetRatio = offsetRatio>0.0 ? offsetRatio : 0; //make sure 
//we don't get negative ratios 
//(negative values may crash some browsers while others ignore it) 
textAreaToScroll.getElement().setScrollTop(
     textAreaToScroll.getElement().getScrollHeight() * offsetRatio );

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

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

Как я сказал, я на самом деле не проверял это, возможно, я перевернул логику и другие тонкие ошибки.

1 голос
/ 09 мая 2012

Чтобы улучшить ответ Штейна, вы можете посчитать количество строк в тексте, а затем установить верхнюю позицию на основе желаемой строки по всей строке вместо использования символов.

Во время подсчета строк вам также придется определить, в какой строке находится курсор.

String text = textArea.getText();
int lines = 1;
int pos = 0;
int cursorPos = ...;
int cursorLine = -1;
while((pos = 1+text.indexOf("\n", pos)) > 0)
{
    if (cursorLine == -1 && pos > cursorPos)
        cursorLine = lines;
    lines++;
}
if (lines > 0 && cursorLine > 0 && cursorLine < lines)
{
    int scroll = textArea.getElement().getScrollHeight();
    scroll *= cursorLine;
    scroll /= lines;
    scroll -= 30; // Back up a bit so it's not right at the top
    if (scroll < 0)
        scroll = 0;
    textArea.getElement().setScrollTop(scroll);
}
0 голосов
/ 13 июля 2013

это сработало для меня: GWT textArea Scroll Issue

http://www.gwtplayground.com/2012/08/gwt-textarea-scroll-issue_21.html

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