我在窗口中有几个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(强制客户端更新)?
答案 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);
(第二个按钮只是为了好玩)