Moin zusammen,
ich hab' grad ein ähnliches Problem, komme aber irgendwie mit euren Lösungsansätzen nicht zum Ziel...
Meine Problemstellung gestaltet sich folgendermaßen, dass es verschiedene Klassen gibt, die jeweils als Threads laufen sollen, und zwar
-> Die Hauptklasse des Programmes mit der void main, die die komplette kontrolle hat
sie startet alle Threads
-> Klassen mit Anwendungslogik, die von der Hauptklasse in Threads gestartet werden und ihre Resultate an die Hauptklasse weitergeben
->Die GUI-Klasse. Sie stößt in der Hauptklasse operationen an und soll auch von dieser Informationen empfangen.
Schematisch geht's um folgende Klassen (ich hab das jetzt auf funktionale Dummies abgebildet, der tatsächliche Code würde hier den Rahmen sprengen...)
Hauptklasse (die Main, die alles verwaltet)
Code:
public class testMain {
private testVisual gui;
public static void main(String[] args) {
testMain t= new testMain();
t.makeGui();
}
private void makeGui(){
gui = new testVisual(this);
Thread tGui = new Thread(gui);
tGui.start();
}
public void sendToGui(String s){
gui.addToTree(s);
}
public void startCountUp(){
Thread c = new Thread(new testThread(this));
c.start();
}
}
Die GUI
Code:
import java.util.ArrayList;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Button;
public class testVisual implements Runnable {
private Shell sShell = null; // @jve:decl-index=0:visual-constraint="56,33"
private Tree tree = null;
private Label label = null;
private Button button = null;
private testMain mainProgramm;
private ArrayList treeitems = new ArrayList();
public testVisual(testMain mainProgram){
this.mainProgramm=mainProgram;
}
private void createSShell() {
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 3;
sShell = new Shell();
sShell.setLayout(gridLayout);
sShell.setSize(new Point(654, 204));
tree = new Tree(sShell, SWT.NONE);
label = new Label(sShell, SWT.NONE);
label.setText("Sehr langer fülltext");
button = new Button(sShell, SWT.NONE);
button.setText("Start");
button.addMouseListener(new org.eclipse.swt.events.MouseAdapter() {
public void mouseUp(org.eclipse.swt.events.MouseEvent e) {
mainProgramm.startCountUp();
}
});
}
public void run() {
Display display = Display.getDefault();
this.createSShell();
this.sShell.open();
while (!this.sShell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
createSShell();
}
public void addToTree(String s){
label.setText(s);
TreeItem t = new TreeItem(tree,0);
t.setText(s);
treeitems.add(t);
}
}
Die eigentliche Anwendungslogik
Code:
public class testThread implements Runnable {
private testMain mainclass;
public testThread(testMain mainclass){
this.mainclass = mainclass;
}
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<1000000;i++){
if((i%5)==0){
if((i%47)==0)
mainclass.sendToGui("Test bei: "+i +"");
}
}
}
}
Wenn ich das ganze nun so implementiere, bekomme ich den bereits beschriebenen Fehler, von wegen dass es dem Thread nicht erlaubt sei, auf die SWT-Komponente zuzugreifen.
Hat mir jemand einen Tip?