Vaadin ComboBox & LQC - PullRequest
       23

Vaadin ComboBox & LQC

2 голосов
/ 13 сентября 2011

Кто-нибудь может предоставить полный пример выбора привязки данных и LazyQueryContainer? Привязка с другим контейнером также приветствуется. (LQC содержит ожидаемый индекс метода в контейнере, а не в элементе - это другое поведение).

Я не могу получить простой пример:

Первая таблица: Валюта (ID, код, имя) .... {1, USD, Dolar; 2, EUR, Euro} Вторая таблица ExchangeRate (ID, CcyFrom, CcyTo, Rate, ValidFrom) ... {1,1,2,1.515,2011 / 01/01; ....}

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

Select result = new Select("Select currency", currencies);        result.setItemCaptionMode(Select.ITEM_CAPTION_MODE_PROPERTY);        result.setItemCaptionPropertyId("code");

Работает нормально.

У меня есть второй контейнер, который содержит некоторый выбор ExchangeRate. Я привязываю его к форме, заменяю TextField на select. Теперь я хочу установить правильное значение для выбора .... но select.setValue (newValue) не работает Когда я отлаживаю его, я обнаружил, что newValue не было найдено в контейнере ... как я могу сделать это правильно?

Есть несколько примеров в книге vaadin, к сожалению, они не используют LQC или не используют контейнер для выбора источника (всплывающее окно и значение).

Ответы [ 4 ]

2 голосов
/ 16 сентября 2011

Я использую Criteria Container (подкласс Lazy Query Container), однако кажется, что это и ComboBox несовместимы, поскольку LQC предоставляет индекс и ComboBox ожидает элемент - см. http://vaadin.com/forum/-/message_boards/view_message/254510

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

  BeanItemContainer<Contact> bic = new BeanItemContainer<Contact>(Contact.class);
  List<Contact> contacts = dao.all(Contact.class, Contact_.lastName);
  bic.addAll(contacts);

  ComboBox cb = new ComboBox("Please select contact");
  cb.setContainerDataSource(bic);
0 голосов
/ 30 декабря 2014

SQLContainer

Вы запросили другие примеры контейнерного типа. Ниже приведен пример для SQLContainer (см. Книга Ваадина ).

Пример взят из блога

Я нашел этот превосходный и простой пример в публикации 2012-11 года, Подключение контейнера Vaadin SQL к комбинированному блоку , Пол Ридман . Смотрите объявление для деталей. Ниже приведены его фрагменты кода. Некоторые комментарии были добавлены или изменены мной.

Фрагменты кода

Создайте метод loadSuburbs для возврата источника данных контейнера. Этот метод создает SQLContainer как этот…

TableQuery q = new TableQuery("suburb", connectionPool);
suburbContainer = new SQLContainer(q);

Вызовите этот метод, передав результат в комбинированный список.

ComboBox suburbCB = new ComboBox();
suburbCB.addItem("");
suburbCB.setCaption("Filter by Suburb");
suburbCB.setContainerDataSource(app.getDatabase().loadSuburbs());  // Hook-up SQLContainer.

// Specify which Property (field) in the SQLContainer to display as content in the ComboBox.
// If omitted, the 'id' Property appears as content.
suburbCB.setItemCaptionPropertyId("name");
suburbCB.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY);

// Set a reasonable width
suburbCB.setWidth(350, UNITS_PIXELS);

// Set the appropriate filtering mode for this example, allowing user to type-ahead.
suburbCB.setFilteringMode(Filtering.FILTERINGMODE_STARTSWITH);
suburbCB.setImmediate(true);
0 голосов
/ 01 февраля 2013

даже эта ветка довольно старая ... Я думаю, что другое решение будет использовать основные контейнеры Vaadin с нумерацией страниц. это обеспечит максимальное количество записей, установленных клиентом. С другой стороны, мне любопытно, могу ли я использовать LazyQueryCOntainer, используя устаревшую реализацию dao, а не реализуя интерфейс QUeryFactory. Любые отзывы полезны.

0 голосов
/ 25 мая 2012

Добавление нескольких тысяч элементов в ComboBox НЕ является эффективным, когда вы начинаете масштабирование пользователей. Помните, что все это спрятано в HttpSession. Если вы не очень осторожны, ваше потребление памяти будет расти.

Недавно я провел простой тест для профилирования приложения, которое использовало IndexedContainer против BeanItemContainer, и объем используемой памяти ОЧЕНЬ отличался. Тестируемый BeanItem был постоянным объектом JPA со многими взаимосвязями и свойствами. Для выпадающего списка нам действительно нужны только два свойства: id и name.

BeanItemContainer потребляет 50 МБ на пользователя против 2 МБ на пользователя для IndexedContainer. Таким образом, как вы можете видеть, он не будет хорошо масштабироваться, если вы не будете осторожны с тем, какой тип информации хранится в сеансе. ИМХО даже 2 МБ не является удовлетворительным, и лучший дизайн вместо этого будет использовать ленивый контейнер запросов.

BeanItemContainer существенно создаст копию каждого поля / ассоциации, независимо от того, содержит ли оно данные или нет, на которые приходится большая часть различий в памяти. Плагин Eclipse Memory Analyzer очень удобен для анализа дампов кучи:)

class EditViewTest {

private ComboBox comboBox

@Test
void serialize() {
    BeanItemContainer<Organization> container = new BeanItemContainer<Organization>(Organization)
    container.addAll(getAllOrgs().sort({ a, b -> a.name <=> b.name }))

    comboBox = new ComboBox('Organization', container)
    comboBox.setItemCaptionMode(Select.ITEM_CAPTION_MODE_PROPERTY)
    comboBox.setItemCaptionPropertyId("name")

    long fileLength
    def temp = File.createTempFile('orgs','.ser')
    try {
        temp.withObjectOutputStream { out ->
            out << comboBox
        }
        fileLength = temp.length()
    }
    finally {
        temp.delete()
    }

    println fileLength / 1024 / 1024
    HeapDumper.dumpHeap('serialize.bin', true)

    Thread.sleep(10000L)
}

@Test
void serialize2() {
    comboBox = new ComboBox()
    getAllOrgs().each { Organization org ->
        comboBox.addItem(org.id)
        comboBox.setItemCaption(org.id, org.name)
    }

    long fileLength
    def temp = File.createTempFile('orgs','.ser')
    try {
        temp.withObjectOutputStream { out ->
            out << comboBox
        }
        fileLength = temp.length()
    }
    finally {
        temp.delete()
    }

    println fileLength / 1024 / 1024
    HeapDumper.dumpHeap('serialize2.bin', true)

    Thread.sleep(10000L)
}

private List getAllOrgs() {
    def orgs = []
    3197.times {
        orgs << new Organization(id: UUID.randomUUID().toString(), 
            company: new Company(name: RandomStringUtils.randomAscii(24)))
    }
    return orgs
}
}

Вы можете использовать HotSpotDiagnosticMXBean для программного дампа кучи с Oracle JVM или 'com.ibm.jvm.Dump.HeapDump ()' для IBM JDK.

2 МБ кучи потреблено (сериализовано: 0,33 МБ) против 50 МБ (сериализовано: 13,12 МБ)

YMMV в зависимости от используемой платформы / JDK.

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