Vaadin addStyleName проблема - PullRequest
0 голосов
/ 05 мая 2011

Я создал 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);
   }
}

1 Ответ

2 голосов
/ 20 мая 2011

Я бы предположил, что происходит следующее:

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

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

Решения:

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

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

...