我在一个窗口中有几个TextField和一个Button,例如aButton。TextField、Button和window都有setIm的(True)。
当TextField失去焦点时,会执行一些验证代码,如果失败,它会调用:aButton. setEn的(False);
当不正确的数据输入到一个TextField中,然后焦点丢失时,调试器会显示aButton. setEn的(False)被调用,但aButton看起来仍然启用。
从这里可能会发生两件事:
1.)如果一个人修改了另一个TextField中的数据并退出该字段(失去焦点),该字段的验证可以成功或不成功,但系统知道调用aButton. setEn的(False),因为以前的TextField仍然无效。这一次,尽管aButton在视觉上被禁用。
2.)如果单击一个在视觉上启用的按钮,它会产生此警告,然后在视觉上禁用:警告:忽略禁用组件的变量更改
目前使用Vaadin 6.7.3
是否有任何已知的工作方法可以强制按钮在手动设置为禁用后立即在视觉上禁用(强制客户端更新)?
可悲的是,我现在只有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);
(第二个按钮只是为了好玩)
button. setViable(false)将始终有效。您需要小心不要在焦点丢失事件上触发另一个事件,该事件最终将按钮的可见性设置为true。
您可以请求重新绘制组件或整个窗口,但框架的重点是您永远不需要这样做,因为视觉修改的组件将在每次请求时自动重新绘制。
只是出于好奇,您是否在尝试查看浏览器是否更新之前让您的请求完成?或者您在调试器中通过setViable()行后立即查看浏览器?
我认为你的点nr 2发生是因为你点击了按钮,按照这个顺序发生的是:第一次你的焦点丢失事件运行(可能禁用你的按钮),第二次按钮点击运行,不知何故,该按钮请求重新绘制,因为按钮中发生了状态更改,但重新绘制显示警告,它不会对它做任何事情,因为它被禁用(只是被焦点丢失事件禁用)
作为旁注。我认为这个UI不会带来好的用户体验,应该是相反的,如果验证没问题,那么显示按钮(或者更好,总是显示按钮,但是启用/禁用),但这取决于…