Ich habe mal eine Frage zu dem guava - Eventbus, interessanterweise kann ich keine Methoden in Vaadinkomponenten (d. h. Vaadinservlets) als Subscriber definieren. Zunächst habe ich hier eine Klasse, also meine Vaadinkomponente.
In der enter-Methode meiner Vaadinkomponente wird die init-Methode der MyOnlineStat-Klasse aufgerufen, und der dort befindliche Eventbus funktioniert wunderbar. Derselbe Eventbus, also der in der MyOnlineStat-Klasse ist, hat aber auch in der ChatView-Klasse einen Subscriber (siehe Zeile 103), und der geht nicht, was ich mit dem Debugger auch schon getestet habe – nur habe ich absolut keine Ahnung, woran das liegen könnte. Hier noch die andere Klasse, also die mit dem Eventbus:
Java:
package com.tsher;
import java.util.ArrayList;
import com.google.common.eventbus.EventBus;
import com.google.gwt.thirdparty.guava.common.eventbus.Subscribe;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.ui.Button;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.GridLayout;
import com.vaadin.ui.Notification;
import com.vaadin.ui.UI;
import com.vaadin.ui.Button.ClickEvent;
import daacc.LgnAccDAOImpl;
import dispatch.EventLogOnEvent;
/**
* @author sleipnir
*
*/
public class ChatView extends CustomComponent implements View{
private static final long serialVersionUID = 1L;
public static final String NAME = "chatview";
private Button lgoutaction;
//private MyCommunication;
private MyOnlineStat onlineStat;
private MyBuddies theBuddies;
private ArrayList<String> buddies;
/**
* Konstruktor
*/
public ChatView() {
onlineStat = new MyOnlineStat();
theBuddies = new MyBuddies(createBuddyList());
createTools();
setCompositionRoot(createChatLayout());
}
/**
* Die Buddyliste wird geladen.
*/
private ArrayList<String> createBuddyList(){
buddies = new ArrayList<String>();
buddies.add("testuser2");
return buddies;
}
/**
* Es werden die nötogen Datenstruktiren initialisiert.
*/
private void createTools(){
//Logoutbutton
lgoutaction = new Button("logout");
lgoutaction.setWidth(180, Unit.PIXELS);
lgoutaction.addClickListener(new Button.ClickListener() {
private static final long serialVersionUID = 1L;
public void buttonClick(ClickEvent event) {
String username = (String) UI.getCurrent().getSession().getAttribute("currentUser");
onlineStat.init((String) UI.getCurrent().getSession().getAttribute("currentUser"), false,theBuddies.getBuddies());
}
});
}
@SuppressWarnings({ "deprecation", "unchecked" })
private GridLayout createChatLayout(){
final GridLayout gridlayout = new GridLayout(3, 3);
gridlayout.addStyleName(ThemeStyle.Chatgridlayout);
gridlayout.setMargin(true);
gridlayout.addComponent(lgoutaction,0,0);
return gridlayout;
}
@Subscribe
public void addLogOnChangedEvent(EventLogOnEvent event){
//Wenn in den Buddies, die das Event mit sich führt, ich ein Buddy bin, dann muss ich dementsprechend
//meine BuddyTabelle oder zumindest den User, der auch im Event steckt, neu laden.
System.out.println("arg0");
}
@Override
public void enter(ViewChangeEvent event) {
String username = (String) UI.getCurrent().getSession().getAttribute("currentUser");
onlineStat.init((String) UI.getCurrent().getSession().getAttribute("currentUser"), true,theBuddies.getBuddies());
}
}
In der enter-Methode meiner Vaadinkomponente wird die init-Methode der MyOnlineStat-Klasse aufgerufen, und der dort befindliche Eventbus funktioniert wunderbar. Derselbe Eventbus, also der in der MyOnlineStat-Klasse ist, hat aber auch in der ChatView-Klasse einen Subscriber (siehe Zeile 103), und der geht nicht, was ich mit dem Debugger auch schon getestet habe – nur habe ich absolut keine Ahnung, woran das liegen könnte. Hier noch die andere Klasse, also die mit dem Eventbus:
Java:
package com.tsher;
import java.util.ArrayList;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import com.vaadin.ui.UI;
import daacc.LgnAccDAOImpl;
import dispatch.EventLogOnEvent;
public class MyOnlineStat {
@Subscribe
public void addLogOnEvent(EventLogOnEvent event){
LgnAccDAOImpl lgn = new LgnAccDAOImpl();
lgn.setOnlineStat(event.getUsername(),event.getStat());
}
public void init(String name,boolean on,ArrayList<String> buddies){
EventBus eventBus = new EventBus();
eventBus.register(this);
EventLogOnEvent event = new EventLogOnEvent();
event.setUserName(name);
event.setUsersBuddies(buddies);
event.setStat(on);
eventBus.post(event);
}
}