数据绑定后更新不会更新UI中的内容

时间:2015-08-28 15:47:33

标签: vaadin7

很抱歉,我现在必须有心理上的困难,因为我不知道问题出在哪里,应该是微不足道的。我已经准备了一个简单的场景,我使用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;
        }

    }

}

2 个答案:

答案 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;。