Vaadin:强制按钮被视觉禁用

Vaadin:强制按钮被视觉禁用,vaadin,Vaadin,我在一个窗口内有几个文本字段以及一个按钮,例如aButton。 文本字段、按钮和窗口都有setImmediate(True) 当TextField失去焦点时,将执行一些验证代码,如果失败,则调用: aButton.setEnabled(假) 当在一个文本字段中输入不正确的数据,然后焦点丢失时,调试器显示调用了aButton.setEnabled(False),但aButton看起来仍然处于启用状态 从这里可能会发生两件事: 1.)如果修改另一个文本字段中的数据并退出该字段(失去焦点),则该字段的

我在一个窗口内有几个文本字段以及一个按钮,例如aButton。 文本字段、按钮和窗口都有setImmediate(True)

当TextField失去焦点时,将执行一些验证代码,如果失败,则调用: aButton.setEnabled(假)

当在一个文本字段中输入不正确的数据,然后焦点丢失时,调试器显示调用了aButton.setEnabled(False),但aButton看起来仍然处于启用状态

从这里可能会发生两件事:

1.)如果修改另一个文本字段中的数据并退出该字段(失去焦点),则该字段的验证可能成功或失败,但系统知道调用aButton.setEnabled(False),因为前一个文本字段仍然无效。但这一次,阿布顿的视力被禁用了

2.)如果单击可视启用的桥头,则会产生此警告,然后可视禁用: 警告:忽略禁用组件的变量更改,caption=OK

目前正在使用Vaadin 6.7.3

手动将aButton设置为禁用后,是否有任何已知的解决方法可以强制aButton立即在视觉上禁用(强制客户端更新)?

按钮。setVisible(false)将始终有效。您需要小心不要在focus lost事件上触发另一个事件,该事件最终会将按钮的可见性设置为true

您可以请求重新绘制组件或整个窗口,但框架的要点是您永远不需要这样做,因为可视修改的组件将在每次请求时自动重新绘制

只是好奇一下,在尝试查看浏览器是否更新之前,是否让请求完成?或者在调试器中传递setVisible()行后立即查看浏览器

我认为你的第2点发生是因为你点击了按钮,按这个顺序发生的是:1你的焦点丢失事件运行(这可能会禁用你的按钮),第二个按钮单击运行,不知何故,由于按钮中发生状态更改,该按钮被请求重新绘制,但重新绘制显示警告,表示它不会对该按钮执行任何操作,因为该按钮已被禁用(仅被焦点丢失事件禁用)

作为旁注。我认为这个UI不会带来良好的用户体验,它应该是另一种方式,如果验证正常,则显示按钮(或者更好,总是显示按钮,但启用/禁用),但这取决于

遗憾的是,我现在只有瓦丁7可供使用,但我还是检查了这个。它按照你希望的那样工作,我必须得出结论,这在瓦丁6.7.3中应该是一样的。这部分在Vaadin7中并没有什么不同。。。您是否在单独的代码中尝试过此功能(仅在文本框和按钮中)

(第二个按钮只是为了好玩)

VerticalLayout vlTestContent = new VerticalLayout();
final Button butChangeMe = new Button("Enabled");
final TextField tf = new TextField("Blur", "default value");
tf.addBlurListener(new BlurListener() {
    private static final long serialVersionUID = 5544993392287938660L;
    @Override
    public void blur(BlurEvent event) {
        butChangeMe.setCaption("Disabled");
        butChangeMe.setEnabled(false);
    }
});
Button but = new Button("Change button", new ClickListener() {
    private static final long serialVersionUID = -2235317499126190105L;
    @Override
    public void buttonClick(ClickEvent event) {
        butChangeMe.setCaption("Enabled");
        butChangeMe.setEnabled(true);
    }
});
vlTestContent.addComponent(butChangeMe);
vlTestContent.addComponent(tf);
vlTestContent.addComponent(but);