【问题标题】:Refresh grid from another UI in Vaadin从 Vaadin 中的另一个 UI 刷新网格
【发布时间】:2019-10-24 15:49:09
【问题描述】:

我有一个主布局,其中包含另一个带有网格和按钮的 UI。这个网格显示了我的数据库表的数据。使用按钮打开一个向导,我可以在其中创建该数据库的新条目。当我单击按钮关闭向导时,我希望刷新网格以显示新添加的条目。一切正常,包括存储到我的数据库,除了刷新我的网格。

所以我有用户界面

   public class MainLayout{
   ...
   public void refreshGrid()
   {
      this.grid.getDataProvider().refreshAll();
   }

   }

我的网格是在哪里定义的。我已经实现了刷新方法。还有创建新条目的按钮。当我单击此按钮时,将调用下一个 UI。 此 UI 包含向导的一般布局,带有一个标签栏。

public class WizardLayout{
}

在其中一个选项卡中,最后是带有输入字段的 UI 以创建条目。还有保存到数据库的按钮。

public class CreateEntry{
...
private void button_onClick(ClickEvent<Button> event)
{
...
}
}

在此按钮单击方法中,实现了保存它的逻辑。之后我想从第一个 UI 调用 refresh 方法来刷新它。我该怎么做才能让它发挥作用?

请记住,其他一切正常。所以我唯一的问题是刷新网格,因为它不会自动。我必须单击浏览器中的刷新按钮才能使其工作。

【问题讨论】:

  • 查看番石榴事件总线

标签: java vaadin


【解决方案1】:

首先请注意,虽然并非不正确,但您对术语 UI 的使用在 Vaadin 上下文中可能会造成混淆,因为它通常用于指代 Vaadin UI 对象,其中通常每个选项卡都有一个对象。 Vaadin UI 之间的通信比您的用例更复杂。

对此有很多解决方案,最简单的可能是将MainLayout 的实例传递给您的向导。

在这种情况下,类将紧密耦合,即两者相互依赖。

更好的方法是使用某种侦听器或回调。这可以变得相当复杂,但在最简单的情况下,您只需传递一个将在保存时运行的回调。

WizardLayout.java

private final Runnable saveCallback;

public WizardLayout(Runnable saveCallback) {
    this.saveCallback = saveCallback;
}

private void button_onClick(ClickEvent<Button> event) {
    ...
    saveCallback.run();
}

MainLayout.java

new WizardLayout(this::refreshGrid);

【讨论】:

  • 按钮点击事件在 CreateEntry 类中。所以你添加到 WizardLayout 的所有东西都必须在 CreateEntry 中,对吗?那么我必须在wizardLayout 中更改什么?
  • 传递我的 mainlayaout 实例有效,但我想了解您提到的最后一个解决方案。你能再描述一下吗?
  • 那么 WizardLayout 需要将监听器传递给 CreateLayout。不了解项目的所有细节就很难说,因为如果您的 WizardLayout 是通用的,您可能也不希望将它耦合到 CreateLayout。
  • 当我的方法 refreshGrid 有参数时,我必须更改什么?例如刷新网格(字符串名称)。当我执行new WizardLayout(this::refreshGrid) 时,出现错误“构造函数 WizardLayout(this::refreshGrid) 未定义。
  • 然后你可以把Runnable改成Consumer&lt;String&gt;
【解决方案2】:

您的数据提供者是使用in-memory items,还是使用callback dataprovider with lazy loading

您可能正在使用内存中的数据提供程序。当您从数据库中加载您的项目并使用

将它们放入网格时就是这种情况
grid.setItems(fooService.findAll());

调用grid.getDataProvider().refresh() 只会刷新已经设置好的项目。由于您有一个要显示的新项目,您必须使用您的服务从数据库中再次获取所有项目。

grid.setItems(fooService.findAll());
grid.getDataProvider().refreshAll();

如果您使用延迟加载的回调数据提供程序,那么我认为只需刷新数据提供程序就足够了。我对延迟加载的数据提供者了解不多,无法为这个问题提供解决方案,但我相信如果使用回调数据提供者,这个问题首先不应该出现

【讨论】:

  • 我不使用setItems(),只是一个获取类型为渴望的数据提供者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
  • 2019-01-23
  • 1970-01-01
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多