在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件事:
任何方法,建议都值得欢迎。
谢谢。
答案 0 :(得分:2)
这种方式行不通。
任何UI组件都只分配给一个Vaadin会话。 因此,您不能让一个窗口被多个UI实例使用。
处理用例的正确方法是为每个用户提供一个窗口,然后将它们与某种事件总线或广播结合,以便更新所有窗口。
为此,您需要在项目中启用Push,因为服务器必须将更新发送给“非活动”用户。
https://vaadin.com/docs/v8/framework/articles/BroadcastingMessagesToOtherUsers.html