SWT Operation auf GUI-Komponente kommt mal wieder nicht an...

hdi

Top Contributor
Hey,
ich müh mich ja grad gezwungermaßen (Plugin für Eclipse) mit SWT ab.
Jetzt tut der EDT schon wieder nicht was ich will:

Java:
    @Override
    public void handleEvent(Event e) {
	log.showButton(false);
	doImport();
	log.showButton(true);
    }

diese showButton Methode delegiert einfach an die setVisible() eines Buttons.
Anfangs ist der Button nicht sichtbar, und nachdem doImport() abgearbeitet wurde (läuft nicht in einem neuen Thread) wird der Button angezeigt. Also so wie man es erwartet.

ABER: Wenn er erstmal sichtbar ist und dieses Event wird wieder ausgelöst, verschwindet er nicht bis doImport() fertig ist. So als würde die erste Zeile in der handleEvent() nicht drin stehen.

Ich befürchte ja ihr kommt schon wieder mit asynch/syncExec usw, was bisher bei mir IMMER zu ner Exception geführt hat aber wer weiss :)

Ich versteh das Konzept von SWT da eh noch gar nicht. zB in der doImport() werden diverse setText()-Aufrufe auf ein Label gemacht, und die Änderung sieht man auch on-the-fly, d.h. diese Events kann er nicht hinter die handleEvent-Methode schieben - die werden sofort ausgeführt! Aber wieso geht dann das hier nicht...

Danke für eure Hilfe!
 
Zuletzt bearbeitet:

Wildcard

Top Contributor
Das hat nichts mit SWT im speziellen zu tun, du verstehst im allgemeinen nicht wie grafische Oberflächen funktionieren ;)
Du darfst long Running Operations niemals im UI Thread ausführen. Es muss also ein neuer Thread her für deinen Import.
Dieser Thread darf niemals die Oberfläche (direkt, oder indirekt) verändern, sonst fliegt eine InvalidThreadAccess Exception. Wenn du in dem Thread die Oberfläche verändern willst, dann musst du diesen Aufruf vom UI Thread ausführen lassen, dazu dann Display#(a)syncExec.
 

hdi

Top Contributor
Wildcard ich versteh das durchaus, und mit Swing hab ich da auch keine Probleme. Mir ist auch klar dass dieser Code in Swing so nicht funktionieren würde, aber:
zB in der doImport() werden diverse setText()-Aufrufe auf ein Label gemacht, und die Änderung sieht man auch on-the-fly, d.h. diese Events kann er nicht hinter die handleEvent-Methode schieben - die werden sofort ausgeführt!
Hier wird also innerhalb einer long running operation etwas in der GUI verändert und das funktioniert halt auch - geht wohl in SWT also und da frage ich mich wieso dann nicht genauso das Ändern der Sichtbarkeit geht.

...Problem ist dass dieses asynch/syncExec oder die Job-Klasse bei mir bisher nicht funktioniert haben, das klingt schon alles sinnig für mich aber ich bekomme immer diese Exception dass ein falscher Thread drauf zugreift :bahnhof: Das Konzept ist mir ja klar in Swing funzt das bei mir auch gut aber in SWT geht da nix.
 

Wildcard

Top Contributor
Wildcard ich versteh das durchaus, und mit Swing hab ich da auch keine Probleme.
Falsch, in Swing merkst du nur nicht das du ein Problem hast (bis dein Problem beim Kunden aufschlägt).
Das Threading Modell von SWT und Swing ist identisch, nur das SWT früh fehlschlägt (wie es sein sollte) und Swing in Threading Issues rennt, was wesentlich schlimmer ist.


...Problem ist dass dieses asynch/syncExec oder die Job-Klasse bei mir bisher nicht funktioniert haben, das klingt schon alles sinnig für mich aber ich bekomme immer diese Exception dass ein falscher Thread drauf zugreift
Weil nur der UI Thread die Oberfläche ändern darf (wie in Swing) und das versucht dir die Exception zu sagen. Zeig den Code der die Exception wirft, dann kann ich dir auch helfen.
:bahnhof: Das Konzept ist mir ja klar in Swing funzt das bei mir auch gut aber in SWT geht da nix.
Siehe oben, das ist falsch. Swing hat identische Restriktionen nur werden sie nicht forciert. Sei froh das dir SWT diesen Fehler wirft, sonst wüsstest du nämlich gar nicht das du etwas falsch machst.
 

hdi

Top Contributor
Neeeeee!! *whine* Ich verstehe es echt bitte glaub mir ;)

Java:
// method entered by EDT i.e. listener
button.setText("Processing...");
new Thread(){
     public void run(){
           calculateSomething();
           EventQueue.invokeLater(new Runnable(){
                  public void run(){
                       button.setText("DONE!");
                  }
            }
     }
}.start();

So macht man das doch in Swing, oder etwa nicht? Und hier wird kein Fehler auftreten nicht weil Swing da nicht sofort reagiert, sondern weil es keinen gibt.

Das ist mir sonnenklar! Leider funzt das hier bei mir mit SWT irgendwie nicht so recht, aber ich versuch jetzt noch rum. Das ist allein schon scheisse zu testen weils n Plugin ist und ich ständig ne neue Eclipse App starten muss, im Debug-Modus geht's auch net weil da werden mir keine konkreten Fehler angezeigt usw. Display.getCurrent()/Default liefert grad immer null , nervt alles etwas grad.. :bae:

Ich versuch's jetzt nochmal Zeile für Zeile das muss ja gehen echt -.-
 

Wildcard

Top Contributor
Neeeeee!! *whine* Ich verstehe es echt bitte glaub mir ;)
Das System ist 1:1 identisch...

Java:
// method entered by EDT i.e. listener
button.setText("Processing...");
new Thread(){
     public void run(){
           calculateSomething();
           EventQueue.invokeLater(new Runnable(){
                  public void run(){
                       button.setText("DONE!");
                  }
            }
     }
}.start();

So macht man das doch in Swing, oder etwa nicht? Und hier wird kein Fehler auftreten nicht weil Swing da nicht sofort reagiert, sondern weil es keinen gibt.
In deinem Fall ändert doImport aber die UI und das ist auch in Swing verboten.

Das ist mir sonnenklar! Leider funzt das hier bei mir mit SWT irgendwie nicht so recht, aber ich versuch jetzt noch rum. Das ist allein schon scheisse zu testen weils n Plugin ist und ich ständig ne neue Eclipse App starten muss, im Debug-Modus geht's auch net weil da werden mir keine konkreten Fehler angezeigt usw. Display.getCurrent()/Default liefert grad immer null , nervt alles etwas grad.. :bae:

Der Debug Mode funktioniert auch bestens bei Eclipse Plugins...
Display.getCurrent liefert in einem non-UI Thread grundsätzlich null und das steht auch so in der API-Doc.
Display.getDefault liefert mit an Sicherheit grenzender Wahrscheinlichkeit allerdings nicht null ;)
Besser wäre allerdings wenn dein Thread direkt das richtige Display von aussen mitbekommt.
 

hdi

Top Contributor
In deinem Fall ändert doImport aber die UI und das ist auch in Swing verboten.
Jo ich weiss das war ja nur ein Bsp grad. Hab ich eben alles schon mal gemacht gehabt - siehe anderer Thread hier irgendwo in diesem Unterforum aber es hat immer geknallt.

Display.getDefault liefert mit an Sicherheit grenzender Wahrscheinlichkeit allerdings nicht null
Dann war das wohl noch nicht refreshed & ich hätte neu starten müssen kann sogar sein. (Eig. war ich aber im Debug-Modus)

Besser wäre allerdings wenn dein Thread direkt das richtige Display von aussen mitbekommt.
Jo hab ich jetzt so gemacht - passt :)

...Naja also wenn's ich jetzt ja doch richtig verstanden hab muss es sich ja um nen Flüchtichkeitsfehler handeln dass ich noch immer ne Exception krieg, ich wär mir nicht bewusst SWT-alpha-0.0.0.01 heruntergeladen zu haben xD

Ich meld mich wenn ich noch immer nicht weiterkomm. Ansonsten nochmal danke zur Klärung ich dachte mir ja eig schon dass es so wie in Swing funktioniert aber war mir dann nicht mehr sicher als ich immer nur Fehler gekriegt hab.
 

Wildcard

Top Contributor
Du bekommst also weiterhin eine InvalidThreadAccess Exception? Du solltest recht leicht am Stacktrace ablesen können wo du vergessen hast Display#asyncExec aufzurufen. Falls nicht, poste mal Stacktrace + passender Code dann sollten wir das Problem fix beheben können...
Übrigens: für Background Jobs würde ich dir die Eclipse Jobs API empfehlen. Kinderleicht zu bedienen und nimmt dir viele Sorgen ab...
 

hdi

Top Contributor
Puh... FINALLY!
Jetzt geht alles - immer wieder komisch wie man denkt man hat eine Sache so schon mal 1:1 probiert und es ging nicht - und "plötzlich" geht's ;)

Ein Jammer nur dass meine doImport() Methode jetzt aussieht wie ein Haufen Sch*** :(
Ist ein Problem wenn die Logik darin stark von Werten aus GUI-Komponenten abhängt, da man ständig Runnables machen muss für den synchExec()-call, dann kann man natürlich nur auf finals zugreifen und oft geht nicht mal das weil die Klassen anonym sind.

Jetzt musste ich mir ein paar Instanzvariablen anlegen damit ich überhaupt Zugriff auf manche Dinge hab...

Naja whatever wenigstens geht es jetzt. Danke für deine Geduld :toll:

PS: Der nächste Thread kommt sehr bald denn ich steh jetzt grad schon vor dem nächsten Problem ;) Aber ich müh mich jetzt noch n bisschen selber damit ab bevor ich dich weiter belaste

edit: Diese Job Klasse schau ich mir jetzt auch nochmal an thx. Vllt krieg ich den Code damit etwas aufgeräumt.
 
Zuletzt bearbeitet:

Wildcard

Top Contributor
Du könntest zB von IProgressMonitor ableiten und eigene Methoden anbieten um die GUI asynchron aus dem Job heraus zu aktualisieren. Deinen eigenen ProgessMonitor wrapst du dann um den den der Job übergeben bekommt damit du auch weiterhin Progress reporten kannst.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Swing Update eine JTabelle nach einer Drag&Drop Operation AWT, Swing, JavaFX & SWT 0
M 2D-Grafik LookupOp Operation auf BufferedImage AWT, Swing, JavaFX & SWT 7
C keine weiteren Events während Drag&Drop Operation möglich? AWT, Swing, JavaFX & SWT 5
S Swing DnD: Image während Drag-Operation ändern AWT, Swing, JavaFX & SWT 3
J Designfrage bei rechenintensiver Operation AWT, Swing, JavaFX & SWT 7
hdi non-default close operation bei JDialog AWT, Swing, JavaFX & SWT 2
Maxim6394 JavaFX Scene Builder - Crash bei eigener Komponente AWT, Swing, JavaFX & SWT 2
H JDialog in Größe ändern - Resize-Cursor bleibt betreten der Komponente AWT, Swing, JavaFX & SWT 1
temi JavaFX "Frames" in JavaFx - passende Komponente? AWT, Swing, JavaFX & SWT 13
J Swing Komponente wird unpassend angepasst in der Größe AWT, Swing, JavaFX & SWT 35
M4cM4rco0707 JavaFX Custom-Komponente mit Custom-Controller AWT, Swing, JavaFX & SWT 3
J Komponente wird manchmal falsch gezeichnet AWT, Swing, JavaFX & SWT 0
R Swing Komponente im JFrame überschreinen sich AWT, Swing, JavaFX & SWT 7
Q-bert Dynamische Komponente erzeugen AWT, Swing, JavaFX & SWT 6
G vorgefertigte Buttons oder neue Komponente mit MouseListener? AWT, Swing, JavaFX & SWT 0
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
Tom299 JavaFX Ähnliche Komponente wie der VB6 Frame? AWT, Swing, JavaFX & SWT 2
M JavaFX Progressbar bar und track Komponente zur Laufzeit ändern AWT, Swing, JavaFX & SWT 2
Tort-E JavaFX Daten an WebView Komponente AWT, Swing, JavaFX & SWT 1
G JPanel komponente Löschen AWT, Swing, JavaFX & SWT 7
T Swing Index für Komponente in JPanel? AWT, Swing, JavaFX & SWT 6
T Swing Größe einer Komponente in einem BoxLayout / FlowLayout festlegen AWT, Swing, JavaFX & SWT 7
G Border der Komponente bei Table CellRenderer überschreiben AWT, Swing, JavaFX & SWT 0
P Warten auf komponente AWT, Swing, JavaFX & SWT 2
U LookAndFeel für eine Komponente AWT, Swing, JavaFX & SWT 2
E Mit Netbeans von einer Form auf eine Komponente einer anderen Form zugreifen AWT, Swing, JavaFX & SWT 2
G Zeichnen auf eine schwergewichtige Komponente? AWT, Swing, JavaFX & SWT 0
T Komponente wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
S Swing Komponente wird überblendet AWT, Swing, JavaFX & SWT 27
A Swing Komponente mehrseitig ausdrucken AWT, Swing, JavaFX & SWT 2
V Fertige Komponente zum Anzeigen mehrerer Bilder AWT, Swing, JavaFX & SWT 5
B Swing Komponente an Position eines Objektes ausgeben lassen AWT, Swing, JavaFX & SWT 3
R Swing Komponente austauschen AWT, Swing, JavaFX & SWT 2
M JApplet mit Java 3D Komponente AWT, Swing, JavaFX & SWT 6
M Swing JMenu verdeckt durch Komponente (aber kein AWT und Swing mix!?) AWT, Swing, JavaFX & SWT 3
N Swing Java Komponente zur Darstellung von klickbaren Links, die Java Funktionen ausführen können AWT, Swing, JavaFX & SWT 2
S Swing Eigene Komponente (JPanel) soll ChangeEvents verteilen AWT, Swing, JavaFX & SWT 12
S Spezielle komponente aktualisieren AWT, Swing, JavaFX & SWT 9
GUI-Programmer LayoutManager Kurze Layout Frage - eine komponente mittig? AWT, Swing, JavaFX & SWT 5
1 Swing Spaltenbreite and CellEditor- Komponente anpassen AWT, Swing, JavaFX & SWT 4
R Komponente wieder entfernen AWT, Swing, JavaFX & SWT 13
B Komponente "sauber" entfernen(JToolBar) AWT, Swing, JavaFX & SWT 4
xehpuk Swing Komponente in Graustufen zeichnen AWT, Swing, JavaFX & SWT 2
A Swing GlassPane Cursor wird bei fremder Komponente nicht angezeigt AWT, Swing, JavaFX & SWT 3
darekkay Swing Komponente zur Laufzeit neuinitialisieren AWT, Swing, JavaFX & SWT 6
K Swing Komponente als Bild speichern AWT, Swing, JavaFX & SWT 11
F visuelle Komponente AWT, Swing, JavaFX & SWT 3
padde479 Komponente gesucht AWT, Swing, JavaFX & SWT 2
A Swing Komponente für Swing und JSF durch MVC AWT, Swing, JavaFX & SWT 5
P Swing Eigene Komponente Entwickeln - erben von JComponent oder JPanel? AWT, Swing, JavaFX & SWT 5
A Swing suche OpenSource Date(Time)Picker Komponente AWT, Swing, JavaFX & SWT 9
N Swing außerhalb des Hauptframe Komponente/Frame öffnen AWT, Swing, JavaFX & SWT 2
S Feste Position einer Komponente auf Glasspane AWT, Swing, JavaFX & SWT 6
B Erfragen der Komponente AWT, Swing, JavaFX & SWT 4
M Mausklick an darunterliegende Komponente weiterleiten AWT, Swing, JavaFX & SWT 9
B (Swing) Welche Komponente für unterteilten Text? AWT, Swing, JavaFX & SWT 4
D Wie nennt sich beschriebene Komponente? (-> Autocomplete) AWT, Swing, JavaFX & SWT 5
D Komponente im FlowLayout nicht mittig sondern rechts. Wie? AWT, Swing, JavaFX & SWT 4
G Swing Komponente gesucht (Textfeld mit Liste) AWT, Swing, JavaFX & SWT 2
padde479 Suche eine Komponente (->ToolBar) AWT, Swing, JavaFX & SWT 7
algorismi Browser Komponente AWT, Swing, JavaFX & SWT 3
G Swing Auswahlrechteck über Komponente zeichnen AWT, Swing, JavaFX & SWT 3
0 Swing Drag n' Drop Bug wenn Source und Target gleiche Komponente? AWT, Swing, JavaFX & SWT 4
C Swing Komponente mit setLocation auf JPanel funktioniert nicht AWT, Swing, JavaFX & SWT 3
G Gibt es diese Komponente? AWT, Swing, JavaFX & SWT 11
slawaweis Suche TagCloud Komponente für Swing AWT, Swing, JavaFX & SWT 10
H Swing Eigene Komponente wird nur halb oder komisch angezeigt AWT, Swing, JavaFX & SWT 3
M Combobox soll Farbe einer Komponente setzen AWT, Swing, JavaFX & SWT 2
H Swing Eigene Komponente reagiert falsch auf mouseClicked() AWT, Swing, JavaFX & SWT 5
D swt komponente in swing-frame AWT, Swing, JavaFX & SWT 4
N Suche nach Komponente / LaF AWT, Swing, JavaFX & SWT 21
A Komponente zur Laufzeit hinzufügen und RICHTIG anzeigen AWT, Swing, JavaFX & SWT 3
T Swing Gibt es eine Komponente für eine farbliche Editorbox? AWT, Swing, JavaFX & SWT 6
S Swing Komponente mit jogl AWT, Swing, JavaFX & SWT 18
Airwolf89 Swing Von anderer Klasse auf Eigenschaften einer Komponente zugreifen AWT, Swing, JavaFX & SWT 5
SuperSeppel13 Komponente transparent übermalen AWT, Swing, JavaFX & SWT 2
I Swing Warten, bis eine GUI-Komponente aktualisiert ist? AWT, Swing, JavaFX & SWT 4
R Lineal an einer Komponente AWT, Swing, JavaFX & SWT 10
R KeyListener - welcher Komponente hinzufügen AWT, Swing, JavaFX & SWT 5
Ham Swing PropertyChangeListener aufrufende Komponente AWT, Swing, JavaFX & SWT 5
hdi LayoutManager GridBagLayout : Komponente hat falsche Größe? AWT, Swing, JavaFX & SWT 2
hdi Swing Suche passende API Klasse(n) für meine Komponente AWT, Swing, JavaFX & SWT 8
Ä Graphics-Komponente auf JPanel wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
H Name einer Komponente ermitteln AWT, Swing, JavaFX & SWT 5
Developer_X Swing Problem beim "rezeichnen" -> Überzeichnen der Komponente AWT, Swing, JavaFX & SWT 8
M Suche Java Komponente AWT, Swing, JavaFX & SWT 2
D Swing Eigene Komponente mit JSpinner AWT, Swing, JavaFX & SWT 4
B Swing setDefaultButton geht nicht - Komponente fängt Events ab AWT, Swing, JavaFX & SWT 5
A Suche TreeTable-Komponente AWT, Swing, JavaFX & SWT 12
GilbertGrape ActionListener implementieren oder Eigenen für jede Komponente? AWT, Swing, JavaFX & SWT 9
C Spaltenorientierte Komponente, ähnlich JTabbed gesucht AWT, Swing, JavaFX & SWT 4
V Suche Komponente AWT, Swing, JavaFX & SWT 2
G Komponente zur Laufzeit tauschen. AWT, Swing, JavaFX & SWT 5
G Coverflow -artige Komponente für Swing? AWT, Swing, JavaFX & SWT 2
F eigene Swing-Komponente. Drehregler AWT, Swing, JavaFX & SWT 4
Landei Welche Kalender-Komponente? AWT, Swing, JavaFX & SWT 3
G Komponente in der der Cursor steht zurückgeben? AWT, Swing, JavaFX & SWT 2
P Unsichtbare Komponente in ein Bild rendern? AWT, Swing, JavaFX & SWT 11
G Komponente die im Center und North Bereich liegt zurückgebe? AWT, Swing, JavaFX & SWT 6
O Zwei Listener auf Komponente, warten auf Beendigun? AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben