Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Also von zeit zu zeit mal den workspace wechseln kann wunder wirken xD. Jetzt schau ich mir mal das RCP-Tutorial weiter an. Kreisen doch noch ein paar [c]?[/c] über dem Kopf wenn ich mir den SourceCode vom Excempel unds Ergebnis anschaue :-/
So also ich möcht nochmal nachhaken weil ich es noch immer nicht hinbekommen hab...
Hab nun den Code von SirWayne versucht:
Java:
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
public class SWTScrolledComposite {
public static void main(String[] args) {
Shell shell = new Shell();
final Button button = new Button(shell, SWT.PUSH);
button.setText("Test");
button.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
button.setEnabled(false);
System.out.println("hier");
Job job = new Job("test") {
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
button.setEnabled(true);
}
});
return null;
}
};
job.schedule();
}
});
GridDataFactory dataFactory = GridDataFactory.swtDefaults().align(SWT.FILL, SWT.FILL).hint(SWT.DEFAULT, 50).grab(true, true);
dataFactory.applyTo(button);
GridLayout grid = new GridLayout();
grid.numColumns = 2;
shell.setLayout(grid);
shell.pack();
shell.open();
Display display = shell.getDisplay();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
}
Bekomme jedes mal die Exception dass der falsche Thread zugreift bei
Code:
button.setEnabled(true)
. Hab schon Display.getDefault(), Display.getCurrent() versucht und auch eine Referenz des Displays meines Dialogs - alles sowohl mit syncExec() als auch asyncExec() - jedes mal der selbe Fehler ?!
Ich kann das Bsp leider nicht in einem KSKB testen da mir ein paar Klassen fehlen zB die Job-Klasse. Hab im Build-Path eig. aus meinem Eclipse Plugin Ordner die nötigen jars geaddet geht aber net.
In meinem Plugin-Projekt kennt er aber alle Klassen. Ich denke dass es nicht geht liegt vllt eben auch genau daran dass es sich hier bei mir um ein Plugin handelt?
Also kA.. zumindest regt es mich echt auf ich dachte immer SWT sei besser als dieses EDT Konzept in AWT/Swing aber ich bring hier nix zum Laufen. Ist ja eh schon sehr sehr sonderbar dass Events IMMER angenommen werden egal ob setEnabled() ein oder ausgeschaltet ist.
Also habt ihr noch eine Idee?
Ansonsten greif ich jetzt dann zu Tomate's Notlösung auch wenn die mir nicht gefällt...
In meinem Plugin-Projekt kennt er aber alle Klassen. Ich denke dass es nicht geht liegt vllt eben auch genau daran dass es sich hier bei mir um ein Plugin handelt?
Ja sag ich ja in meinem Plugin-Projekt funktioniert es. Ich meinte nur ich kann nicht testen ob es vllt mit dem Plugin zusammenhängt da ich kein normales Java-Projekt mit diesem Code kompilieren kann, da dort einige Libs nicht verfügbar sind.
Hab wie gesagt versucht sie im Build Path zu adden, geht aber nur z.T. (SWT kann ich adden und klappt, aber mein org.eclipse.runtime Paket aus dem Eclipse plugin-Ordner enthält scheinbar doch nicht die nötigen Klassen wie zB "Job")
Also kA.. zumindest regt es mich echt auf ich dachte immer SWT sei besser als dieses EDT Konzept in AWT/Swing aber ich bring hier nix zum Laufen. Ist ja eh schon sehr sehr sonderbar dass Events IMMER angenommen werden egal ob setEnabled() ein oder ausgeschaltet ist.
Man sollte halt wissen was man macht... Ist doch logisch dass er die Events animmt, warum sollte er auch nicht??? Du legt den Thread lahm und danach kommt erst das enable false also nimmer er alle Events zwischen drin in die Queue mit auf wäre auch schlimm wenn es nicht so wäre... Das gleiche wie in Swing den GUI Thread sollte man halt nicht lahm legen... Das schöne in SWT ist halt, wenn man im falschen Thread ist bekommt man eine Exception wenn man auf widget zugreift.
Was bekommst du den für eine Exception??? Du kannst die Job Klasse doch nach programmieren ??? Einfach den lang ausführenden task in ein async rein und fertig SWT Display und Threading, Eclipse Jobs
Warum willst du kein eclipse RCP benutzen??? Du weißt schon dass wenn du nachher deine Anwendung auf verschiedene OS laufen willst, dass du jedes mal eine neue SWT.jar brauchst???