SWT Threading und Modifikationen

erdmaennchen

Mitglied
Folgendes Verhalten möchte ich erreichen (das ist natürlich nur ein Beispielfall, stellt aber mein Problem relativ gut dar):

  • Eine main-Methode wird aufgerufen
  • Diese Methode zeigt eine Shell an
  • Ich will einen Button auf dieser Shell unsichtbar machen

Zur Verdeutlichung mal ein Beispiel-Code dazu:
Java:
public class MyScreen {

    private final Shell myShell;
    private final Button myButton;

    public MyScreen(Shell parentShell) {

        if (parentShell == null) {
            Display display = new Display();
            this.myShell = new Shell(display);            
        } else 
            this.myShell = new Shell(parentShell);
                    
        this.myButton = new Button(myShell, SWT.NONE);
        this.myShell.setLayout(new FillLayout());

        myShell.open();
        
        while (!myShell.isDisposed())
            if (!myShell.getDisplay().readAndDispatch())
                myShell.getDisplay().sleep();
    }

    public Button getMyButton() {
        return this.myButton;
    }

    public static void main(String... args) {
        // Screen erstellen
        MyScreen Starter = new MyScreen(null);
        // Foo hat sich geändert, jetzt soll der Button nicht mehr sichtbar sein
        starter.getMyButton().setVisible(false);
    }
}

Wie man vielleicht sieht, versuche ich meine eigenen Screens zu erstellen (um genau zu sein, habe ich eine abstrakte Basis-Klasse erstellt, die bestimmte immer wiederkehrende Dinge in jedem der Screens meiner Applikation mitbringt). So kann aber natürlich kein modulares Konzept funktionieren. Durch die while-Schleife verliere ich jegliche Möglichkeit, sinnvoll mit meiner GUI zu "reden".

Mir ist klar, dass mir hier scheinbar etwas grundsätzliches nicht klar ist, bezüglich des Threading-Verhaltens. Ich habe das Stichwort syncExec durchaus schon gelesen. Allerdings ist mir gerade trotzdem schlicht nicht klar, wie ich meine Views (die in unterschiedlichster Weise voneinander abhängen sollen) aus einer main-Methode heraus koordinieren soll.
 
G

Gast2

Gast
Ja dafür sind Events da??? Sowas würde auch nicht in Swing gehen !!! Von diesem Screen solltest du nur EINEN haben,weil das ist dein Hauptfenster und der Code in der main wird erst ausgeführt wenn dein Hauptfenster disposed wird.... Darum ist kein Code total sinnlos du kannst doch den Button nicht unsichtbar machen wenn es den Screen nicht mehr gibt ???
 
Zuletzt bearbeitet von einem Moderator:

erdmaennchen

Mitglied
Du verstehst mein Problem tatsächlich nicht :).

Dadurch, dass beispielsweise Swing im Hintergrund freundlich mit Threads werkeln, wirkt es, als ob man einen Screen "lostreten" würde und man direkt nach dem Aufruf davon gemütlich weiter an anderen Dingen arbeiten kann (im Hauptthread) und später auch beliebig versuchen kann, Änderungen an diesem Screen vorzunehmen. Ich habe es so aufgeschrieben, wie SWT es macht - dass so etwas da nicht funktioniert, da der Screen da bereits weg wäre, ist mir durchaus klar (man kann ja schließlich auch erst wieder im Hauptthread weiterarbeiten, sobald der Screen weg ist).
 
G

Gast2

Gast
Du verstehst mein Problem tatsächlich nicht :).

Dadurch, dass beispielsweise Swing im Hintergrund freundlich mit Threads werkeln, wirkt es, als ob man einen Screen "lostreten" würde und man direkt nach dem Aufruf davon gemütlich weiter an anderen Dingen arbeiten kann (im Hauptthread) und später auch beliebig versuchen kann, Änderungen an diesem Screen vorzunehmen. Ich habe es so aufgeschrieben, wie SWT es macht - dass so etwas da nicht funktioniert, da der Screen da bereits weg wäre, ist mir durchaus klar (man kann ja schließlich auch erst wieder im Hauptthread weiterarbeiten, sobald der Screen weg ist).

Ein Swing beispiel wäre interessant um zu sehen was du meinst???? Ich glaube du hast einiges mit den Threads nicht verstanden und was du vor hast weiß ich leider immer noch nicht???:L Den dein Code ergibt echt keinen Sinn^^ du willst einen Button disablen den es nicht mehr gibt!!! Was soll den das Ziel davon sein ^^??? Du hast einen Thread der deine GUI verwaltet... Du hast ein Hauptfenster und du willst mehrer machen warum??? Benutz einen Dialog dafür, ich glaub nicht dass du mehrere Shells benutzen kannst!!!
 
Zuletzt bearbeitet von einem Moderator:

erdmaennchen

Mitglied
Du scheinst nur einfach das Problem nicht zu verstehen. Vielleicht hast du auch zu lang nicht mehr mit Swing gearbeitet oder erzeugst immer nur One-Screen-Anwendungen. Aber ich hole einfach mal mehr aus, damit du siehst, was ich meine (ich hatte den Part oben bewusst sehr kurz gehalten, weil es eigentlich um ein allgemeines Problem ging).

In Swing ist es möglich von JFrame abzuleiten. Wenn ich nun mehrere Fenster möchte, die einige Eigenschaften teilen, könnte ich diese Fenster einfach in einer main-Methode (oder wo auch immer) erzeugen, laufen lassen und zu einem beliebigen Zeitpunkt später darauf zugreifen (sofern ich in irgendeiner Form an das Objekt komme.

Und genau das funktioniert in SWT nicht - oder nicht auf diese Weise. Ich hatte ja bereits geschrieben, dass ich beim Thread-Verhalten von SWT (nicht allgemein sondern nur auf SWT bezogen also) nicht ganz durchblicke - was auch daran liegen könnte, dass ich mich seit exakt 2 Tagen mit dem Thema beschäftige. Ich kann in SWT nicht von Shell ableiten. Ergo bleibt mir nichts, als eine eigene Klasse zu schreiben, die eine Shell (oder ein Display) bekommt. Shells laufen aber in SWT nur, wenn man sie mit dieser tollen auf Events-wartenden Endlosschleife versieht (man verzeihe meinen leichten Sarkasmus - er geht nicht darauf zurück, dass ich in irgendeiner Form die Architektur von SWT angreifen möchte, sondern schlicht darauf, dass dieser Punkt tatsächlich der einzige ist, der den Einstieg in SWT erschwert). Nur: Wie kann ich dann Apps mit mehreren simultan laufenden Fenstern starten? Ist die Methode tatsächlich die, jedes einzelne Fenster eigens in einem neuen Thread zu starten, dort ein eigenes Display zu holen und dann wie gehabt weiterzumachen?

Ich hoffe, dass nun das Problem klarer ist.
 
G

Gast2

Gast
In Swing ist es möglich von JFrame abzuleiten. Wenn ich nun mehrere Fenster möchte, die einige Eigenschaften teilen, könnte ich diese Fenster einfach in einer main-Methode (oder wo auch immer) erzeugen, laufen lassen und zu einem beliebigen Zeitpunkt später darauf zugreifen (sofern ich in irgendeiner Form an das Objekt komme.

Ich arbeite jeden Tag mit Swing(leider)!!! Aber in meinen Augen macht es keinen Sinn in einer Anwendung mehrere JFrames zu haben, mir ist nicht eine Anwendung bekannt wo dass Sinn machen würde... Nur weil etwas geht heißt es nicht, dass es GUT sein muss !!!! Du kannst auch bei Swing auf GUI widgets in background Threads zugreifen ja es geht und darum ist es gut??????:L

Und soviel ich weiß lässt SWT nur eine Shell zu, was ich persönlich gut finde, dass man keinen Murks machen kann...Wenn du mehrer Shells haben willst, sowie du das aufbaust, musst du sowas hier machen...
Shell Style : Shell DisplaySWT JFace EclipseJava !!! du MUSST deinen Code vor der der while schleifen laufen lassen weil, dass ist deine eigentliche main...

Aber wenn du Screens und sonstiges benutzen willst, dann schau dir gleich Eclipse RCP an, da hast du doch alles was du braucsht, Editoren, Views....

EDIT: Was ist denn eine bekannte Anwendung die mehr als 1 Frame hat?
 
Zuletzt bearbeitet von einem Moderator:

alien0matic

Mitglied
Naja, da der Button nichtmehr da ist, wenn du entsprechende Stelle erreichst ist das relativ hinfällig ;)
Jetzt stellt sich halt die Frage wann sich "Foo" ändert.
Bei GUI Aktionen? Dann kannst du im entsprechenden Event darauf reagieren.
Wenn du es als Multithreadinganwendung haben willst musst du selber einen Thread spawnen. Von dem kannst du aber nicht einfach so die GUI ändern, weil nur der GUI Thread selbige ändern darf. Hier musst du die Methoden syncExec() oder asyncExec() nutzen.

Hoffe ich hab die Frage richtig verstanden ;)
 

erdmaennchen

Mitglied
Danke euch beiden. Mir ist jetzt noch eine ganze Ecke klarer geworden, was mit SWT wie läuft.

@ SirWayne: Es ging mir weniger darum, dass ich es jetzt direkt brauche (mehrere Screens), als darum, Bescheid zu wissen, ob und wie es geht (falls es geht). Ich versuche die Systeme, die ich verwende möglichst weit zu begreifen - mit allen Möglichkeiten etc. Das ist nötig, um anständiges Software-Engineering zu betreiben.

@ alien0matic: Dann wird es sich im Zweifelsfall wohl auf die entsprechende Methode hinauslaufen - ich habe da schon etwas getestet und erreiche meine Ziele mittels sync ohne weitere Probleme (auch wenn es etwas merkwürdig aussieht).

Nochmal allgemein:
Meine Anwendung wird dann wohl jetzt so funktionieren, dass meine selbst geschriebenen Screens eine Shell oder null erhalten. Wenn null kommt sind sie quasi root, sonst sind sie ein Child. Wenn nun also Fenster 2 auf einen Click hin ein weiteres Fenster (Nummer 3) starten will, ist dies ohne weiteres möglich. Das einzige, was ich dann vom Zugriff her nochmals testen muss ist, ob folgendes geht: Fenster 2 öffnet Fenster 3 und macht sich selbst unsichtbar. Fenster 3 lässt die Eingabe von Daten zu und hat einen Save-Button. Auf einen Click auf den Save-Button, wird Fenster 3 disposed und Fenster 2 wieder sichtbar und aktiv. Vermutlich werde ich das über irgendeine Form von Controller (eventuell als Action definiert) durchführen.

Ich schreibe jetzt erstmal das reine GUI-Design fertig (ja, ich mache das komplett händisch :) ) und werde danach ausprobieren, wie ich mich von Fenster zu Fenster hangeln (und dabei mit klarer Präsentations- und Logiktrennung arbeiten) kann.
 
G

Gast2

Gast
Naja meine Fragen hast du nicht beanwortet WARUM benutzt mehrere FENSTER?????
Du hast ein Hauptfesnter und sonst nimmst du Dialoge, warum machst du alles so kompliziert??;)
versteh ich net aber gut ^^... ich hab dir genau das gleiche wie der mein vorredner erzählt nur in ausführlich...
 

erdmaennchen

Mitglied
@ SirWayne: Es ging mir weniger darum, dass ich es jetzt direkt brauche (mehrere Screens), als darum, Bescheid zu wissen, ob und wie es geht (falls es geht). Ich versuche die Systeme, die ich verwende möglichst weit zu begreifen - mit allen Möglichkeiten etc. Das ist nötig, um anständiges Software-Engineering zu betreiben.
Manchmal hab ich bei dir ehrlich das Gefühl, mich sehr undeutlich auszudrücken :). Das war die Antwort darauf, warum ich gerne wissen will, ob man mit mehreren Fenstern arbeiten kann. Oh und zum Beispiel in Testbereichen finde ich es übrigens gar nicht unlogisch, mehrere komplett eigenständige Fenster zu haben, mit denen ich dann meinen Zuhörern bei einem Vortrag zeigen kann, wie sich die Fenster aufeinander auswirken. Gut, so etwas würde ich dann jetzt einfach lösen, indem ich komplett eigenständige Programme dazu erzeuge (bzw. je nach Aufbau einfach mehrere Male das selbe Programm aufrufe).

Wie gesagt: Zumindest für mich geht es nicht immer darum, zu wissen, WARUM ich etwas brauchen könnte. Wenn ich als Auto-Mechaniker einen anderen Mechaniker frage, wie ich auf Defekt XYZ reagieren kann und als Antwort erhalte "Das geht nicht kaputt" geht das etwa in die gleiche Richtung wie dein "das brauchst du nicht".

Und ja, ihr habt beide ähnliche Dinge gesagt, weswegen ich mich auch bei euch beiden bedankt habe :).

Super wäre es allerdings, wenn du dir genau den Post, in dem ich diese Dinge geschrieben habe ab "Nochmal allgemein" durchliest. Wenn du in meiner Formulierung dort kein Problem siehst und es für sinnvoll hälst (und mir das bestätigst), hast du mir bereits sehr geholfen und ich würde den Beitrag hier auf [Solved] setzen.
 
G

Gast2

Gast
Wie gesagt: Zumindest für mich geht es nicht immer darum, zu wissen, WARUM ich etwas brauchen könnte. Wenn ich als Auto-Mechaniker einen anderen Mechaniker frage, wie ich auf Defekt XYZ reagieren kann und als Antwort erhalte "Das geht nicht kaputt" geht das etwa in die gleiche Richtung wie dein "das brauchst du nicht".

Nee find ich nicht... Wenn du etwas nicht brauchst, weil es absolut sinnlos ist, musst du es nicht lernen. Wenn etwas defekt geht will der Kunde dass du es reparierst also BRAUCHST du es auch ;)... Des doch was ganz anderes??? Wie gesagt mehrere Fenster dafür wurden DIALOGE erfunden ;)... Und wenn du unbedingt mehrere shells brauchst was ein riesen hack(denk ich mal nie ausprobiert) ist... dann hast du ja den link von oben, da siehst du doch wie es mit mehreren shells gehen könnte?!

Aber was spricht den gegen Dialoge? Du musst doch nichts exotisches machen ;)...
Ich finde das ist ohne richtiges Beispiel alles zu abstrakt und zuviel Theorie... Wie gesagt du kannst vieles machen vor allem in Swing aber ob es gut und im Sinne des Erfinders ist, ist wieder was ganz anderes...
 
Zuletzt bearbeitet von einem Moderator:

Wildcard

Top Contributor
Auch Dialoge sind Shells. Mit SWT kann man ganz genauso mehrere Shells öffnen wie in Swing JFrames. Einziger unterschied, Swing startet den Event Dispatcher Thread im Hintergrund, in SWT ist der Dispatcher Thread explizit, dein Code muss also etwas anders aussehen. Entweder die main Methode forked einen Thread, oder nicht den main Thread als SWT Thread verwenden.
 

Ähnliche Java Themen


Oben