Сетка Ваадина: показать все строки

Как сделать так, чтобы новый виджет Grid в Vaadin 7 отображал все строки данных (а не прокруткой)?


person Basil Bourque    schedule 27.03.2015    source источник


Ответы (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 );
    }
}
person Basil Bourque    schedule 27.03.2015