Проблема Vaadin addStyleName

Я создал TextField с TextChangeListener. Когда пользователь вводит определенные значения (в данном случае «admin»), в этом поле вызывается addStyleName, и цвет шрифта становится красным. Но потом значение пустое и каждый введенный символ очищается.
Вот код приложения. Почему после добавления нового стиля в TextField его значение меняется?

public class VaadintestApplication extends Application {
@Override
public void init() {
    Window mainWindow = new Window("Vaadintest Application");

    setTheme("test");

    TextField textField = new TextField("username");
    textField.setEnabled(true);

    textField.setTextChangeEventMode(TextChangeEventMode.EAGER);
    textField.addListener(new TextChangeListener() {
        public void textChange(TextChangeEvent event) {
            if ("admin".equals(event.getText())) {
                ((TextField) event.getComponent()).addStyleName("text-error");
            } else {
                ((TextField) event.getComponent()).removeStyleName("text-error");
            }
        }
    });

    mainWindow.addComponent(textField);
    setMainWindow(mainWindow);
   }
}

person lowercase    schedule 04.05.2011    source источник


Ответы (1)


Я предполагаю, что происходит следующее:

  • Изменение имени стиля вызывает перерисовку на сервере, в результате чего компонент TextField снова сериализуется для клиента.

  • Клиент получает сериализацию (всю чертову вещь, а не только измененные части, потому что так все работает с Vaadin), и, следовательно, он изменяет содержимое текстового поля, игнорируя любые изменения, ожидающие от слушателя изменения текста.

Решения:

  1. Обновите значение TextField одновременно с добавлением/удалением имени стиля: ((TextField) event.getComponent()).setValue(event.getText())

  2. Создайте собственный виджет на стороне клиента, который расширяет VTextField, и добавьте туда функциональность.

person Jouni    schedule 20.05.2011