Как очистить поля в FieldGroup
в приложении Vaadin 7?Очистить полевую группу в Ваадине 7
Когда я звоню FieldGroup::setItemDataSource
и передать null
, я получаю текст «нулевой» появляется в TextField
объектов, поддерживаемых различными типами данных (число, java.util.Date). Я могу понять нулевые значения, отображающие «null» как представление String. Но почему эти «нулевые» строки не отображаются по умолчанию? По умолчанию я вижу пустые строки TextField во всех полях.
Например, рассмотрим пример приложения ниже. На следующих снимках экрана мы:
- Запустить приложение. Пользователь не предпринимает никаких действий.
Все поля пустые, без строк, без «нулевого» текста. - Пользователь нажимает кнопку «Показать Бернарда».
- Пользователь нажимает кнопку «Показать никому». Эта кнопка вызывает
FieldGroup::setItemDataSource(null)
, минуя нуль.
Оба поля числа и даты имеют «нулевой» текст. Почему сейчас, а не при запуске?
Как я могу вернуться к пустым значениям?
запуск App
Пользователь нажимает кнопку "Показать Bernard"
Пользователь нажимает "Показать No One" кнопку
Вот полное одно-файлное приложение Vaadin 7.5.3 в Java 8 (с использованием синтаксиса Lambda).
package com.example.gridexample;
import javax.servlet.annotation.WebServlet;
import com.vaadin.annotations.Theme;
import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.annotations.Widgetset;
import com.vaadin.data.fieldgroup.FieldGroup;
import com.vaadin.data.util.ObjectProperty;
import com.vaadin.data.util.PropertysetItem;
import com.vaadin.data.util.converter.StringToDateConverter;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinServlet;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Label;
import com.vaadin.ui.TextField;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Date;
/**
*
*/
@Theme ("mytheme")
@Widgetset ("com.example.gridexample.MyAppWidgetset")
public class MyUI extends UI
{
PropertysetItem itemAaron = null;
PropertysetItem itemBernard = null;
TextField nameField = null;
TextField ageField = null;
TextField dateOfBirthField = null;
FieldGroup fieldGroup = null;
ZoneId zone = ZoneId.systemDefault(); // Or ZoneId.of("America/Montreal") ;
@Override
protected void init (VaadinRequest vaadinRequest) {
final VerticalLayout layout = new VerticalLayout();
layout.setMargin(true);
layout.setSpacing(true);
setContent(layout);
Button buttonAaron = new Button("Show Aaron");
buttonAaron.addClickListener((ClickEvent event) -> {
showAaron();
});
layout.addComponent(buttonAaron);
Button buttonBernard = new Button("Show Bernard");
buttonBernard.addClickListener((ClickEvent event) -> {
showBernard();
});
layout.addComponent(buttonBernard);
Button buttonNoOne = new Button("Show No One");
buttonNoOne.addClickListener((ClickEvent event) -> {
showNoOne();
});
layout.addComponent(buttonNoOne);
this.itemAaron = new PropertysetItem();
this.itemAaron.addItemProperty("name" , new ObjectProperty<>("Aaron"));
this.itemAaron.addItemProperty("age" , new ObjectProperty<>(42));
this.itemAaron.addItemProperty("dateOfBirth" , new ObjectProperty<>(Date.from(ZonedDateTime.now(this.zone).minusYears(42).toInstant())));
this.itemBernard = new PropertysetItem();
this.itemBernard.addItemProperty("name" , new ObjectProperty<>("Bernard"));
this.itemBernard.addItemProperty("age" , new ObjectProperty<>(24));
this.itemBernard.addItemProperty("dateOfBirth" , new ObjectProperty<>(Date.from(ZonedDateTime.now(this.zone).minusYears(24).toInstant())));
this.nameField = new TextField("Name:");
this.ageField = new TextField("Age:");
this.dateOfBirthField = new TextField("Date Of Birth:");
// Customize the Converter assigned to our date-time field. A StringToDateConverter object is assigned by default.
//this.dateOfBirthField.setConverter(new StringToDateConverter()); // Actually the default.
// this.dateOfBirthField.setConverter(new SpecialStringToDateConverter());
layout.addComponent(this.nameField);
layout.addComponent(this.ageField);
layout.addComponent(this.dateOfBirthField);
this.fieldGroup = new FieldGroup();
this.fieldGroup.bind(this.nameField , "name");
this.fieldGroup.bind(this.ageField , "age");
this.fieldGroup.bind(this.dateOfBirthField , "dateOfBirth");
this.fieldGroup.setReadOnly(true);
}
private void showAaron() {
this.fieldGroup.setItemDataSource(this.itemAaron);
}
private void showBernard() {
this.fieldGroup.setItemDataSource(this.itemBernard);
}
private void showNoOne() {
this.fieldGroup.setItemDataSource(null);
}
@WebServlet (urlPatterns = "/*" , name = "MyUIServlet" , asyncSupported = true)
@VaadinServletConfiguration (ui = MyUI.class , productionMode = false)
public static class MyUIServlet extends VaadinServlet
{
}
}
Установка нулевого представления на этих полях должна обеспечивать последовательное поведение. На самом деле, я больше удивляюсь непустым текстовым полям в исходном состоянии. – cfrick