Как сделать так, чтобы новый виджет Grid
в Vaadin 7 отображал все строки данных (а не прокруткой)?
Сетка Ваадина: показать все строки
Ответы (1)
Режим высоты
Для начала нужно переключить режим высоты. Вместо того, чтобы ориентироваться на высоту, ориентированную на CSS, вам нужна высота, ориентированная на строки.
myGrid.setHeightMode( HeightMode.ROW );
Затем вы можете установить количество отображаемых строк. Вы можете указать дробные строки, поскольку аргумент количества строк является двойным.
this.setHeightByRows( myDouble );
Избегайте нулевых рядов
Итак, чтобы показать все строки, передайте двойное число с количеством строк в вашей содержащей поддержку Grid. Но проверьте ноль, поскольку сетка не допускает никаких строк. Если у вас нет данных в вашем контейнере, укажите произвольное количество пустых строк.
int size = this.getContainerDataSource().size();
double rows = ( size > 0 ) ? size : myDefaultRowCount;
Двухрядная ошибка
В моем собственном проекте я столкнулся с неприятной ошибкой в Vaadin 7.4.2, когда установка счетчика строк два (диапазон от 2.0d до 2.7d) вызывает высокую загрузку процессора и минутные задержки, поскольку страница частично загружается, но никогда не кажется конец. Я не могу воспроизвести в примере приложения, но не могу определить другую причину в моем собственном приложении. В качестве обходного пути мой код просто использует 3.0d
(или 2.8d
) вместо любого появления 2.0d
.
if ( rows == 2.0d ) { rows = 2.8d; // Workaround for weird bug.
}
Пример подкласса
Вот подкласс Grid, который добавляет слушателя для любого изменения в наборе строк. Слушатель сбрасывает высоту сетки, чтобы отобразить все строки свежих данных.
package com.example;
import com.vaadin.data.Container;
import com.vaadin.shared.ui.grid.HeightMode;
/**
* Adds one feature to Grid: Automatically resize the height to show all
* rows.
*
* @author Basil Bourque.
* Released under ISC License, http://opensource.org/licenses/ISC
*/
public class GridAllRowsTall extends Grid
{
static double defaultRowsCount = 3.0d;
// -----| Constructors |-------------------------
public GridAllRowsTall ()
{
super();
this.initialize();
}
public GridAllRowsTall ( Container.Indexed dataSource )
{
super( dataSource );
this.initialize();
}
public GridAllRowsTall ( String caption )
{
super( caption );
this.initialize();
}
public GridAllRowsTall ( String caption , Container.Indexed dataSource )
{
super( caption , dataSource );
this.initialize();
}
// -----| Init |-------------------------
@Override
void initialize ()
{
// Add a listener so when the set of items changes, re-size the Grid to display all rows.
if ( this.getContainerDataSource() instanceof Container.ItemSetChangeNotifier ) {
Container.ItemSetChangeNotifier n = ( Container.ItemSetChangeNotifier ) this.getContainerDataSource();
n.addItemSetChangeListener( ( Container.ItemSetChangeEvent event ) -> {
this.showAllRows();
} );
}
}
// -----| Features |-------------------------
public void showAllRows ()
{
this.setHeightMode( HeightMode.ROW );
int size = this.getContainerDataSource().size();
double rows = ( size > 0 ) ? size : GridAllRowsTall.defaultRowsCount; // Cannot set height to zero rows. So if no data, set height to some arbitrary number of (empty) rows.
if ( rows == 2.0d ) {
rows = 3.0d; // Workaround for weird bug where a value of "2 rows" ( 2.0d - 2.7d ) causes a huge slowdown and major CPU load, and page never finishes updating.
}
this.setHeightByRows( rows );
}
}