瓦丹的辛格尔顿

时间:2018-11-30 09:25:23

标签: java vaadin

Singleton pattern中将Vaadin用于GUI(为我的案子添加一个窗口)是一种好习惯吗?

  

我的用例是:一个窗口不能被其他用户显示,而如果   它已经被一个用户使用。


在该用例之前,我只是将窗口添加到gui中,如下所示:

  this.communicationWindow = new CommunicationConfigWindow();
  this.configSettingsButton.addClickListener( e -> {
     if ( !UI.getCurrent().getWindows().contains( this.communicationWindow )
              && this.communicationWindow != null )
     {
        this.communicationWindow.init( this.config );
        this.getUI().addWindow( this.communicationWindow );
     }
  } );

现在,因为我希望仅由一个用户而不是

显示
this.communicationWindow = new CommunicationConfigWindow();

我只是将其变成了singleton,如下所示,并简单地添加了try/catch块;

this.communicationWindow = CommunicationConfigWindow.getInstance();
this.communicationWindow = new CommunicationConfigWindow();
this.configSettingsButton.addClickListener( e -> {
    if ( !UI.getCurrent().getWindows().contains( this.communicationWindow )
                  && this.communicationWindow != null )
    {
       this.communicationWindow.init( this.config );
       try
       {
           this.getUI().addWindow( this.communicationWindow );
       }
       catch(IllegalArgumentException ex)
       {
           Notification.show( "Configuration invalid", Type.WARNING_MESSAGE);
       }
    }
});

现在,它不允许很多用户显示该窗口(这是我想要的),但是有3件事:

  1. 我真的觉得那是一个不好的习惯,
  2. 在显示窗口时,用户关闭浏览器将不会让其他用户仍然显示。
  3. 我真的是Vaadin的新手。

任何方法,建议都值得欢迎。

谢谢。

1 个答案:

答案 0 :(得分:2)

这种方式行不通。

任何UI组件都只分配给一个Vaadin会话。 因此,您不能让一个窗口被多个UI实例使用。

处理用例的正确方法是为每个用户提供一个窗口,然后将它们与某种事件总线或广播结合,以便更新所有窗口。

为此,您需要在项目中启用Push,因为服务器必须将更新发送给“非活动”用户。

https://vaadin.com/docs/v8/framework/articles/BroadcastingMessagesToOtherUsers.html