vaadin7 - 数据绑定(bind)后更新不会更新 UI 中的内容

标签 vaadin7

抱歉,我现在一定是脑子出了问题,因为我看不出问题出在哪里,而且应该是微不足道的。我准备了一个简单的场景,我使用 BeanFieldGroup 将字段绑定(bind)到 bean 属性,当我单击“更改”和“重置”按钮时,模型设置了正确的值,但 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;
        }

    }

}

最佳答案

我发现的最接近的是 binder.discard(),它强制所有绑定(bind)字段从 bean 中重新读取它的值。是的,它仍然需要手动调用,但仍然远没有 getItemDataSource().getItemProperty(...).setValue(...) 痛苦。如果对这种蛮力方法有任何顾虑,那么当然可以直接在应该受到影响的字段上调用 ​​Field.discard()

关于vaadin7 - 数据绑定(bind)后更新不会更新 UI 中的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32274971/

相关文章:

java - Vaadin 表 - AddNestedContainerProperty

spring - 当 session 未锁定时无法从父级中删除

java - 为什么 Vaadin 忽略第一个组件

java - 无法在远程服务器上运行 Vaadin 应用程序

seo - Vaadin 7 使应用程序 SEO 准备就绪

java - Vaadin动态加载JavaScript、CustomLayout

java - 带页脚的垂直布局?

java - 通过单击 GWT 按钮更改连接器中 Vaadin 自定义小部件的状态并将其获取到服务器端

java - 按主机名设置 vaadin 主题

java - 使用使用 Vaadin 7 的插件将项目从 Vaadin 7 转换为 Vaadin 8 时出现问题