2015-08-09 5 views
2

Как очистить поля в FieldGroup в приложении Vaadin 7?Очистить полевую группу в Ваадине 7

Когда я звоню FieldGroup::setItemDataSource и передать null, я получаю текст «нулевой» появляется в TextField объектов, поддерживаемых различными типами данных (число, java.util.Date). Я могу понять нулевые значения, отображающие «null» как представление String. Но почему эти «нулевые» строки не отображаются по умолчанию? По умолчанию я вижу пустые строки TextField во всех полях.

Например, рассмотрим пример приложения ниже. На следующих снимках экрана мы:

  1. Запустить приложение. Пользователь не предпринимает никаких действий.
    Все поля пустые, без строк, без «нулевого» текста.
  2. Пользователь нажимает кнопку «Показать Бернарда».
  3. Пользователь нажимает кнопку «Показать никому». Эта кнопка вызывает FieldGroup::setItemDataSource(null), минуя нуль.
    Оба поля числа и даты имеют «нулевой» текст. Почему сейчас, а не при запуске?
    Как я могу вернуться к пустым значениям?

запуск App

App launches. User takes no action.

Пользователь нажимает кнопку "Показать Bernard"

User clicks "Show Bernard" button.

Пользователь нажимает "Показать No One" кнопку

User clicks "Show No One" button.

Вот полное одно-файлное приложение 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 
    { 
    } 

} 
+0

Установка нулевого представления на этих полях должна обеспечивать последовательное поведение. На самом деле, я больше удивляюсь непустым текстовым полям в исходном состоянии. – cfrick

ответ

1

Перед нажатием на любую кнопку (начальное состояние) те строки выполняются:

TextField nameField = null; 
//... 
this.nameField = new TextField("Name:"); 

Документация говорит:

общественного TextField (java.lang.String подпись)

Построен пустой TextField с данным заголовком.

Таким образом, все текстовые поля в вашем приложении имеют пустые значения. Но ... После этого вы используете:

this.fieldGroup.bind(this.nameField , "name"); 

Должно ли значение быть нулевым? Опять же документация [bind()] (https://vaadin.com/api/com/vaadin/data/fieldgroup/FieldGroup.html#bind(com.vaadin.ui.Field, java.lang.Object)) говорит:

Связывает поле с заданным PropertyID из текущего пункта.Если товар имеет не был установлен, тогда перевязка отложено до момента, когда товар будет установлен с использованием setItemDataSource(Item).

Таким образом, вы должны использовать этот метод для просмотра эффектов bind.

Вы спрашивали: Но почему эти «нулевые» строки не отображаются по умолчанию?

И я надеюсь, что мое объяснение ясно для вас, что изначально каждый TextField имеет пусто значение. А после вызова bind() функция влияет на просмотр только после setItemDataSource(Item), но вы вызываете эту функцию намного позже в кнопке clickListener. Поэтому изначально это прекрасно, что все поля имеют пустые значения.

0

Попытайтесь добавить this.nameField.setNullRepresentation(""); и назовите тот же метод для каждого поля, в соответствии с Book of Vaadin он должен исправить вашу проблему.

+0

Спасибо за ответ. Но вы пропустили мой вопрос, что является правильным способом очистить данные, поддерживающие поля, а не как обрабатывать отображение нулей после их очистки. –

Смежные вопросы