我知道它可能需要超过10行代码(希望不超过50行),但我想知道你是否可以帮助我。
我尝试根据其他用户的输入在运行时更新一个用户的UI线程。我创建了一个实现三个预定义用户(jim,tom和threeskin)的基本项目。我希望从jim向tom发送一条消息,让它在tom的UI中显示为一个新的Label
对象,即使它们全部都不知道它们。登录。哦,吉姆不应该刷新他的页面。标签应该只是自己在屏幕上产生。
要说我感谢一些帮助,这将是十年的轻描淡写。
public class User {
public String nume;
public User(String nume) {
super();
this.nume = nume;
}
}
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
public class Engine implements ServletContextListener {
public static ArrayList<User>userbase;
public void contextDestroyed(ServletContextEvent arg0) { }
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("This code is running at startup");
userbase =new ArrayList<User>();
userbase.add(new User("jim"));userbase.add(new User("tom"));userbase.add(new User("threeskin"));
}
}
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
public class InfigeUI extends UI {
User us3r;
@WebServlet(value = "/*", asyncSupported = true)
@VaadinServletConfiguration(productionMode = false, ui = InfigeUI.class)
public static class Servlet extends VaadinServlet {}
protected void init(VaadinRequest request) {
VerticalLayout everything=new VerticalLayout();
setContent(everything);
if (us3r==null){everything.addComponent(auth());}else{everything.addComponent(main());}
}
ComponentContainer auth(){
final VerticalLayout layout = new VerticalLayout();
layout.setMargin(true);
TextField userField=new TextField();
Button login = new Button("Log in");
login.addClickListener(new Button.ClickListener() {
public void buttonClick(ClickEvent event) {
us3r=login(userField.getValue());
if (us3r!=null){
saveValue(InfigeUI.this, us3r);
layout.removeAllComponents();
layout.addComponent(main());
}else{Notification.show("I only know jim, tom and threeskin. Which one are you?");}}
});
layout.addComponent(userField);
layout.addComponent(login);
return layout;
}
User login(String nume){
for (int i=0;i<Engine.userbase.size();i++){
if (nume.equals(Engine.userbase.get(i).nume)){return Engine.userbase.get(i);}
}
return null;
}
static void saveValue(InfigeUI ui,User value){
ui.us3r=value;
ui.getSession().setAttribute("something", value);
VaadinService.getCurrentRequest().getWrappedSession().setAttribute("something", value);
}
ComponentContainer main(){
VerticalLayout vl=new VerticalLayout();
Label label=new Label("This is the post-login screen");
String name=new String(us3r.nume);
Label eticheta=new Label(name);
TextField to=new TextField("Send to");
TextField message=new TextField("Message");
Button sendNow=new Button("Send now!");
vl.addComponent(eticheta);
vl.addComponent(label);
vl.addComponent(eticheta);
vl.addComponent(to);
vl.addComponent(message);
vl.addComponent(sendNow);
return vl ;
}
}
答案 0 :(得分:2)
基本上你想要三件事
用户的UI更新,其自身不执行任何操作,或者换言之,从服务器发送到浏览器的消息。要启用此功能,您需要使用@Push注释UI类。否则,仅当用户做出导致服务器访问的事情时才会显示更新,例如,单击按钮
在UI实例之间发送消息的某种方式(每个用户有一个UI实例)。您可以使用一些消息总线实现(CDI,Spring,...),或者您可以使用静态字段(所有用户之间共享静态字段)。参见例如https://github.com/Artur-/SimpleChat了解一种方法。在这里避免使用所有* .getCurrent方法也是一个好主意,因为它们在很多情况下会引用另一个UI而不是你想的(例如当你在接收器代码中时的发送者),你会做除了你之外的事情。打算。
邮件到达时安全地更新用户界面。这是使用UI.access完成的,也可以在聊天示例中看到。
答案 1 :(得分:0)
首先,您需要启用项目的服务器推送help 基于Vaadin文档。 但是,下面的代码示例将给出您想要的内容:
创建广播监听器接口:
public interface BroadcastListener { public void receiveBroadcast(final String message); }
The Broadcaster Class:
public class Broadcaster {
private static final List<BroadcastListener> listeners = new CopyOnWriteArrayList<BroadcastListener>();
public static void register(BroadcastListener listener) {
listeners.add(listener);
}
public static void unregister(BroadcastListener listener) {
listeners.remove(listener);
}
public static void broadcast(final String message) {
for (BroadcastListener listener : listeners) {
listener.receiveBroadcast(message);
}
}
}
推送强化的UI(通过注释):
@Push 公共类BroadcasterUI扩展UI实现BroadcastListener {
@Override
protected void init(VaadinRequest request) {
final VerticalLayout layout = new VerticalLayout();
layout.setMargin(true);
setContent(layout);
final TextArea message = new TextArea("",
"The system is going down for maintenance in 10 minutes");
layout.addComponent(message);
final Button button = new Button("Broadcast");
layout.addComponent(button);
button.addClickListener(new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
Broadcaster.broadcast(message.getValue());
}
});
// Register broadcast listener
Broadcaster.register(this);
}
@Override
public void detach() {
Broadcaster.unregister(this);
super.detach();
}
@Override
public void receiveBroadcast(final String message) {
access(new Runnable() {
@Override
public void run() {
Notification n = new Notification("Message received",
message, Type.TRAY_NOTIFICATION);
n.show(getPage());
}
});
}
您可以找到完整链接here。