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 по линиям, которые я описал. Думаю, тебе придется сделать это самому.
Я получил исключение за пределами, делая выше.
Я решил, что он получает 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();
}