Vaadin:强制按钮被视觉禁用

时间:2013-06-28 22:54:31

标签: vaadin

我在窗口中有几个TextField和一个Button,例如一个按钮。 TextField,Button和window都有setImmediate(True)。

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

如果将错误数据输入到一个TextField中然后焦点丢失,调试器会显示调用aButton.setEnabled(False)但aButton仍然看起来已启用。

从这里可能发生两件事:

1。)如果一个修改另一个TextField中的数据并退出该字段(失去焦点),那么该字段的验证是否成功,但系统知道调用aButton.setEnabled(False),因为之前的TextField仍然是无效。这次虽然aButton在视觉上被禁用了。

2。)如果点击一个视觉上启用的按钮,它会产生此警告,然后在视觉上被禁用: 警告:忽略已禁用组件的变量更改< class'ui.button.Button'>,caption = OK

目前正在使用Vaadin 6.7.3

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

2 个答案:

答案 0 :(得分:1)

button.setVisible(false)将始终有效。您需要小心不要在焦点丢失事件上启动另一个事件,最终将按钮的可见性设置为true。

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

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

我认为您的第2点发生是因为您点击了按钮,按此顺序发生的事情是:第1个您的焦点丢失事件运行(可能会禁用您的按钮),第2个按钮点击运行并以某种方式请求重新绘制对于该按钮,因为状态发生了变化,但是重新显示警告说它不会对它做任何事情,因为它被禁用(只是被焦点丢失事件禁用)

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

答案 1 :(得分:1)

可悲的是,我现在只有 Vaadin 7 ,但我还是检查了这个。它的工作方式正如你想要的那样,我必须得出结论,这在Vaadin 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);

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