很抱歉,我现在必须有心理上的困难,因为我不知道问题出在哪里,应该是微不足道的。我已经准备了一个简单的场景,我使用BeanFieldGroup将字段绑定到bean属性,当我单击Change和Reset按钮时,模型设置为正确的值,但UI中的文本字段不是更新。 我使用Vaadin4Spring,但不应该是问题。
import com.vaadin.data.fieldgroup.BeanFieldGroup;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener;
import com.vaadin.spring.annotation.SpringView;
import com.vaadin.ui.Button;
import com.vaadin.ui.Notification;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
import java.io.Serializable;
@SpringView(name = "test")
public class TestView extends VerticalLayout implements View {
private TextField txtTest = new TextField("Test");
private Button btnChange = new Button("Click!");
private Button btnReset = new Button("Reset");
private TestBean testBean = new TestBean();
public TestView() {
txtTest.setImmediate(true);
addComponent(txtTest);
addComponent(btnChange);
addComponent(btnReset);
BeanFieldGroup<TestBean> binder = new BeanFieldGroup<>(TestBean.class);
binder.setItemDataSource(testBean);
binder.setBuffered(false);
binder.bind(txtTest, "text");
initComponents();
}
private void initComponents() {
btnChange.addClickListener(new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent event) {
testBean.setText("Hello world!");
}
});
btnReset.addClickListener(new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent event) {
testBean.setText("");
}
});
}
@Override
public void enter(ViewChangeListener.ViewChangeEvent event) {
Notification.show("Test");
}
public class TestBean implements Serializable {
private String text;
public TestBean() {
text = "";
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
}
答案 0 :(得分:2)
我发现最接近的是binder.discard()
,它强制所有绑定字段从bean重新读取其值。是的,它仍然需要手动调用,但仍然比getItemDataSource().getItemProperty(...).setValue(...)
痛苦得多。如果对这种蛮力方法有任何疑虑,那么当然可以直接在应该受影响的字段上调用Field.discard()
。
答案 1 :(得分:1)
您正在直接调用bean setter,因为Java没有提供任何方式来监听这种更改,因此Vaadin属性(或TextField)不知道该值已被更改。如果您通过说
来通过Vaadin属性更改值binder.getItemDataSource().getItemProperty("text").setValue("new value");
然后你会看到&#34;新价值&#34;在TextField
上,由于缓存已停用,testBean.getText()
也会返回&#34;新值&#34;。