我使用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);
}
}
答案 0 :(得分:2)
我猜想会发生以下情况:
样式名称更改会触发服务器上的重绘,导致TextField组件再次序列化到客户端
客户端接收序列化(整个血腥的东西,不仅仅是更改的部分,因为这是Vaadin的工作方式),因此它会更改文本字段的内容,同时忽略任何待处理的更改文本更改侦听器
解决方案:
在添加/删除样式名称的同时更新TextField的值:((TextField) event.getComponent()).setValue(event.getText())
创建一个自定义客户端小部件,扩展VTextField并在其中添加功能