GWT 2.4 DataGrid автоматическая прокрутка при выборе элемента

Я использую новый GWT 2.4 DataGrid с в проект. Я настроил DataGrid с размером страницы 50.
Доступный экран недостаточно велик, чтобы отобразить все элементы, и поэтому отображается вертикальная полоса прокрутки (это фактически основная цель использования DataGrid в первую очередь).
Я приложил SingleSelectionModel к DataGrid для того, чтобы иметь возможность выбрать предметы.
Пока это работает нормально.

однако у меня также есть другой виджет, с которым пользователь может взаимодействовать. На основе этого действия пользователя элемент из DataGrid с должен быть выбран.
Иногда выбранный элемент не находится в видимой области экрана, и пользователь должен прокрутить вниз в DataGrid, чтобы увидеть его.
Есть ли способ автоматически или вручную прокрутить вниз, чтобы выбранный элемент был виден?
Я проверил JavaDocs DataGrid и не нашел подходящего метода или функции для этого.

6 ответов


Не знаю, работает ли это, но вы можете попытаться получить элемент строки для выбора и использовать метод scrollIntoView.

Пример Кода:

dataGrid.getRowElement(INDEX_OF_SELECTED_ITEM).scrollIntoView();

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

dataGrid.getRowElement(dataGrid.getVisibleItems().indexOf(object)).getCells().getItem(0).scrollIntoView();

нет времени, чтобы попробовать, но DataGrid реализует интерфейс HasRows, и HasRows имеет, среди прочего, метод под названием setVisibleRange. Вам просто нужно выяснить номер строки элемента, на котором вы хотите сосредоточиться, а затем установить видимый диапазон от этого числа n до n+50. Таким образом, DataGrid будет сброшен, чтобы поместить этот элемент вверху (или около вершины, если он находится в последних 50 элементах списка, поддерживающего DataGrid). Не забудьте перерисовать компонента DataGrid.

вы уже смотрели на это? Если так, то я был бы удивлен, что это не сработало.

О, и поскольку это один виджет, говорящий с другим, у вас, вероятно, есть некоторые сообщения и некоторые обработчики сообщений, так что, когда пользователь взаимодействует с этим вторым виджетом и "выбирает" элемент, сообщение срабатывает на EventBus и обработчик для этого сообщения исправляет DataGrid по линиям, которые я описал. Думаю, тебе придется сделать это самому.


мое решение, немного лучше:

dataGrid.getRow(model).scrollIntoView();

Я получил исключение за пределами, делая выше.

Я решил, что он получает ScrollPanel в DataGrid и используется .scrollToTop () и так далее на панели прокрутки. Однако для доступа к ScrollPanel в DataGrid мне пришлось использовать этот комментарий: http://code.google.com/p/google-web-toolkit/issues/detail?id=6865


Как отметил кем, это раздражает эффект "scrollToRight" после scrollIntoView. После меня решение Kem дает лучшее поведение, чем базовое, поскольку обычно первые столбцы в таблице более значимы. Я немного улучшил его подход, который прокручивается горизонтально до первого столбца строки, которую мы хотим видеть, вычисляя первый видимый столбец слева, прежде чем применять прокрутку, а затем прокручивать его.

последнее примечание: столбцы абсолютные левый тестируется против "51". Это значение я нашел "экспериментально", посмотрев значения JS в инструменте разработчика браузера, я думаю, что это зависит от стиля таблицы, вам может потребоваться изменить/вычислить его.

ниже код:

public void scrollIntoView(T next) {
        int index = datagrid.getVisibleItems().indexOf(next);
        NodeList<TableCellElement> cells = datagrid.getRowElement(index).getCells();
        int firstVisibleIndex = -1;
        for(int i=0; i<cells.getLength() && firstVisibleIndex<0;i++)
            if(UIObject.isVisible(cells.getItem(i)) && (cells.getItem(i).getAbsoluteLeft() > 51) && (cells.getItem(i).getAbsoluteTop() > 0))
                firstVisibleIndex = i;

        cells.getItem(firstVisibleIndex>=0? firstVisibleIndex : 0).scrollIntoView();
}