2

我在一个窗口内有几个TextField 以及一个Button,例如aButton。TextField、Button 和 window 都有 setImmediate(True)。

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

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

从这里可能会发生两种可能的情况:

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

2.) 如果单击视觉上启用的 aButton,它会产生此警告,然后视觉上会变为禁用:警告:忽略禁用组件的变量更改 < class 'ui.button.Button'>,caption=OK

当前使用 Vaadin 6.7.3

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

4

2 回答 2

2

可悲的是,我现在只有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);

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

于 2013-07-01T18:06:56.097 回答
1

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

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

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

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

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

于 2013-07-01T17:39:42.273 回答