Hallo,
ich habe eine View mit einer Table
View:
MyList – Liste welche die Nachrichten enthält
zugehöriges List Interface: IMessageListViewer
Nun habe ich einen 2. Thread welcher empfangene Nachrichten in der View darstellen soll:
Klasse welche Nachrichten empfängt:
Da ich sonst eine Exception bekomme, weil der Viewer in einem anderen Thread läuft, muss ich die Liste über die asyncExec() Methode aktualisieren.
Die Liste bekomme ich (in der newMessage()) über eine statische Variable, nun habe ich da aber 2 Probleme:
1. werden die empfangenen Nachrichten-Objekte (mir unerklärlicherweise) beim empfangen neuer Nachrichten teilweise vom Inhalt verändert und 2. ist die Lösung alles andere als schön/elegant.
Deswegen nun die Frage, wie kann ich es besser machen , d.h. Wie komme ich aus dem 2. Thread in der Methode newMessage() an die Liste um neue Nachrichten anzufügen?
Danke für jeden Tipp!
PS: Es handelt sich um eine RCP Anwendung.
ich habe eine View mit einer Table
View:
Code:
public class MessageView extends ViewPart {
private TableViewer viewer;
private MyList myList;
public void createPartControl(Composite parent) {
this.parent=parent;
myList=new MyList();
StaticClass.setMyList(myList);
Composite tableComposite = new Composite(parent, SWT.NONE);
TableColumnLayout tableColumnLayout = new TableColumnLayout();
tableComposite.setLayout(tableColumnLayout);
viewer = new TableViewer(tableComposite, SWT.MULTI|SWT.H_SCROLL| SWT.V_SCROLL|SWT.FULL_SELECTION);
// Spalte erzeugen
TableViewerColumn viewermessageColumn = new TableViewerColumn(viewer, SWT.NONE);
viewermessageColumn.getColumn().setText("Message");
tableColumnLayout.setColumnData(viewermessageColumn.getColumn(), new ColumnWeightData(88,600,true));
viewer.setContentProvider(new MessageContent...);
viewer.setInput(myList);
}
}
MyList – Liste welche die Nachrichten enthält
Code:
public class MyList {
private Vector<Message> messagelist = new Vector<Message>();
private Set<IMessageListViewer> changeListeners = new HashSet<IMessageListViewer>();
public void addMessage(Message message){
messagelist.add(message);
Iterator<IMessageListViewer> iterator = changeListeners.iterator();
while (iterator.hasNext())
((IMessageListViewer) iterator.next()).addMessage(message);
}
public void removeChangeListener(IMessageListViewer viewer) {
changeListeners.remove(viewer);
}
public void addChangeListener(IMessageListViewer viewer) {
changeListeners.add(viewer);
}
zugehöriges List Interface: IMessageListViewer
Code:
public interface IMessageListViewer {
public void addMessage(FixMessage message);
}
Klasse welche Nachrichten empfängt:
Code:
public class MessageProvider implements IMessage {
@Override
public void newMessage(Message message) {
//Message in Liste adden
final Message a=message;
getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
StaticClass.getMyList.addMessage(a);
}
}
}
}
Da ich sonst eine Exception bekomme, weil der Viewer in einem anderen Thread läuft, muss ich die Liste über die asyncExec() Methode aktualisieren.
Die Liste bekomme ich (in der newMessage()) über eine statische Variable, nun habe ich da aber 2 Probleme:
1. werden die empfangenen Nachrichten-Objekte (mir unerklärlicherweise) beim empfangen neuer Nachrichten teilweise vom Inhalt verändert und 2. ist die Lösung alles andere als schön/elegant.
Deswegen nun die Frage, wie kann ich es besser machen , d.h. Wie komme ich aus dem 2. Thread in der Methode newMessage() an die Liste um neue Nachrichten anzufügen?
Danke für jeden Tipp!
PS: Es handelt sich um eine RCP Anwendung.