如何强制Vaadin更新屏幕?

时间:2011-09-30 08:15:54

标签: java vaadin

我有一个小的Vaadin应用程序,它有几个输入字段(组合框,选择组等...)。其中大部分内容由第一个ComboBox的所选内容决定。但是,当我选择其中的内容时,所有其他内容都保持空白,直到我点击一个,此时它们都会更新。这不是期望的行为,但我认为它是由服务器端是最新的但不更新客户端视图引起的。 (即使在我的第一个Combobox的ValueChangeListener中添加requestRepaint())

必须有一些方法强制Vaadin获取我希望它显示的数据,即使没有点击其他组件?

EDIT 我不允许这么快就回答我自己的问题,所以我暂时把它放在这里:

我发现有一种javascript方法可以同步客户端和服务器。

myComponent.getApplication().getMainWindow().executeJavaScript("javascript:vaadin.forceSync();");

我现在唯一的问题是,当我点击另一个组合框(或两次相同的组合框)时,我的一个组合框上的ValueChangeListener仍然只会触发。这是最奇怪的事情,因为第二个组合框在装载时会完美地发射它的事件。

5 个答案:

答案 0 :(得分:18)

第一个ComboBox是否处于“立即”模式?

如果没有,它可能应该是:component.setImmediate(true)。

请参阅https://vaadin.com/book/-/page/components.selection.html

答案 1 :(得分:4)

如果您为组件设置了强制vaadin重新渲染它们的数据源,则可以使用hack。我用它来更新具有动态数据的表

yourcomponent.setContainerDataSource(yourcomponent.getContainerDataSource());

答案 2 :(得分:4)

我遇到了同样的问题,请参阅下面的版本8.0.5(2017年起):

@Push
public class WebUi extends UI {
   public void fireComponentUpdated() {
      getUI().push();
   }
}

答案 3 :(得分:2)

您是否在正确的组件上请求了重写?

请记住,requestRepaint将组件标记为脏,但并不意味着它将重新绘制 - 客户端只有在向服务器发出请求时才能刷新。

有关您的选项的更多信息,请参阅此主题https://vaadin.com/forum/-/message_boards/view_message/231271(它处理由于后台线程处理而导致的UI刷新)。

答案 4 :(得分:1)

在Vaadin 7 中将此行放在主UI.init(VaadinRequest)方法中就足够了:

UI.getCurrent().setPollInterval( 1000 );

如果你想每秒刷新你的UI(在这种情况下)。这样,您可以指示UI在定义的时间间隔内轮询服务器以进行更改。

请注意,如果您有大量用户同时使用您的应用程序,则过多的服务器流量可能会出现问题。

在Vaadin 6 中你必须使用ProgressIndicator(如果你愿意,它可能是隐形的)并尝试做类似于Vaadin 7中的UI.getCurrent()。setPollInterval(int)