SWT und Listener

Status
Nicht offen für weitere Antworten.

Koringar

Bekanntes Mitglied
Guten Tag,

da ich fast das ganz google durchforstet habe und immer noch nichts gefunden habe stell ich meine Frage mal hier.
Ich suche ein Tutorial zu Listener in SWT, zwar was eins dass beschreibt wie man ein Listener selbst macht. Mit den vorhandenen kenne ich mich schon aus und sie bieten nicht das was ich will, also wollt ich selber einen schreiben.
Es gibt zwar haufen Tutorials zu Listenener, die sind aber bis jetzt alle in Verbindung mit Swing gewesen (leider).

Oder wenn mir einer genauer helfen kann, da ich noch so ziemlicher SWT Neuling bin.
Ich will einen Chat in Java programmieren oder eher habe es schon unter Swing und jetzt wollt ich das mal so Spaßeshalber und um SWT besser kennen zulernen das mal unter SWT nachprogrammieren.
Ich habe eine GUI an dem ein StyleText als Ausgabe des Netzwerkverkehrs und paar Tables und Lists hängen. Über einen Thread starte ich eine Art Listener (benonnung auf Art) die auf den Socket horcht und wartet bis eine Nachricht kommt oder eben bis zum TimeOut. Und wenn ich die Nachricht jetzt weitergeben will und auswerten gibt es immer ein 'Invalid Thread Access' als fehler, da man außerhalb des Shell-Thread nicht auf die GUI zugreifen darf. Ich habe es schon mit des syncExec und asyncExec probiert, aber das hat auch nicht gebracht da dieser Thread zum horchen aufs Netz eine Endlosschleife ist bis der ganze Server oder Client geschlossen wird, als 'hängert' er sich auf.
Nun habe ich durch Google raus gefunden das man das gut über Listener machen könnte, habe dazu aber in Verbindung mit SWT nichts gefunden oder nichts aussagekräftiges.

Wäre schön wenn einer Helfen könnte, als Anforderungen für den Listener sollen sein:
Das er auf den Socket horcht ob eine Nachricht ein trifft, wenn dies der Fall ist dann soll er ein Event auslösen das der Shell mitteilt das eine Nachricht da ist und sie übergibt, damit sie von der Shell verarbeitet werden kann.

Vielen Dank schon mal für die Mühe.

MFG
 
T

tuxedo

Gast
Listener hin oder her: Du musst die Thread-Sperre durchbrechen.
Mit Listener alleine wüsste ich nicht wie man das bewerkstelligen kann.

Ganz naiv könnte man es so entkoppeln:

Der Netzwerkthread schreibt seine Daten in eine Liste. Und damit diese dann in die GUI wandern können, muss der Netzwerkthread asyncExec() auf dem Display aufrufen. Das Runnable das du da übergibst holt sich dann die Daten aus der Liste und zeigt sie in der GUI an.

Kurz gesagt: im asyncExec-Runnable darf nur das erledigt werden was die GUI betrifft. Also nix mit aufm Netzwerk lauschen oder Daten verarbeiten.

So funktioniert das im groben.

- Alex
 

Wildcard

Top Contributor
Sollte dein Swing Client genauso funktionieren, dann ist übrigens auch der falsch, denn ein Background Thread darf auch in Swing nicht die Oberfläche verändern (nur leider wird dort keine Exception geworfen).
 

Koringar

Bekanntes Mitglied
@tuxedo: Erstmal danke für deine Antwort. Sowas in der Art habe ich auch schon versucht, blos da ist wieder das Problem das es sich aufhängt, da er ja in regelmäßigen Abständen diese Liste immer wieder durchgehen muss bis das Programm beendet ist, also wieder so eine Art Endlosschleife.
Wie ich das mit den Listenern mache habe ich mir alles schon theoretisch überlegt und wenn sie so funktionieren wie ich denke, dann sollte es auch klappen. Blos mir fehlt da vollkommen die Praxis in Verbindung mit SWT, des wegen suche ich ja nach einem Tutorial.

@Wildcard: Das weis ich selber, da es aber unter Swing eben keine Exception wirft und alles so klappt, war das mit in erster Linie sowas von egal. Des wegen suche ich ja jetzt auch etwas, das mir damit hilft sowas zuerstellen.
 
T

tuxedo

Gast
@tuxedo: Erstmal danke für deine Antwort. Sowas in der Art habe ich auch schon versucht, blos da ist wieder das Problem das es sich aufhängt, da er ja in regelmäßigen Abständen diese Liste immer wieder durchgehen muss bis das Programm beendet ist, also wieder so eine Art Endlosschleife.

Das runnable das du mit syncexec oder asyncexec ausführst darf keine Endlosschleife enthalten. Das ist der ganze Trick an der Sache. Du darfst da nur "kleine Jobs" die in der GUI erledigt werden müssen reinstecken. Mehr nicht. Die Endlosschleifenlogik musst du im Netzwerkthread oder anderswo handhaben.

Wie ich das mit den Listenern mache habe ich mir alles schon theoretisch überlegt und wenn sie so funktionieren wie ich denke, dann sollte es auch klappen. Blos mir fehlt da vollkommen die Praxis in Verbindung mit SWT, des wegen suche ich ja nach einem Tutorial.

Glaub mir: Mit Listenern wird's nicht besser. Listener sind kein "Heilmittel" für das durchbrechen einer Thread-Barriere.

Selbst wenn du zwischen Netzwerkthread und GUI-Thread einen Listener hängst, der bei jedem eingehenden Chat-Paket benachrichtigt wird und dann die GUI benachrichtigt: Wenn du im GUI-Thread nun wieder viel zu erledigen hast blockiert dieser wieder.

Am besten wird's wohl sein du zeigst mal wie du syncexec, bzw. asyncexec benutzt hast und wie das Runnable aussah, das du da rein gesteckt hast.

- Alex
 

Koringar

Bekanntes Mitglied
Das runnable das du mit syncexec oder asyncexec ausführst darf keine Endlosschleife enthalten. Das ist der ganze Trick an der Sache. Du darfst da nur "kleine Jobs" die in der GUI erledigt werden müssen reinstecken. Mehr nicht. Die Endlosschleifenlogik musst du im Netzwerkthread oder anderswo handhaben.
Danke für den Hinweis, ist mir aber schon klar. Da das syncexec nie wieder zurück geht.

Glaub mir: Mit Listenern wird's nicht besser. Listener sind kein "Heilmittel" für das durchbrechen einer Thread-Barriere.

Selbst wenn du zwischen Netzwerkthread und GUI-Thread einen Listener hängst, der bei jedem eingehenden Chat-Paket benachrichtigt wird und dann die GUI benachrichtigt: Wenn du im GUI-Thread nun wieder viel zu erledigen hast blockiert dieser wieder.

Am besten wird's wohl sein du zeigst mal wie du syncexec, bzw. asyncexec benutzt hast und wie das Runnable aussah, das du da rein gesteckt hast.

- Alex
KA ob es was bringen wird, würde es aber trotzdem gern mal Versuchen. Hatte diese Nacht auch wieder einen Einfall, wie es vielleicht klappen könnte, ich werde es einfach mal versuchen.
Den Code zeige ich dir dann mal, wenn ich es nicht schaffe.
 

Koringar

Bekanntes Mitglied
JAHA:lol:!!!! Ich habe es geschaft, erstmal danke für eure Hilfe. Habs sogar ohne synchExec gemacht :D.

An der richtigen Stelle die Prüfung packen und schon funzt alles ;).

Würde mich aber trotzdem noch für die Listener interessieren, nur so.
 
T

tuxedo

Gast
Wenn du jetzt noch verrätst wie du es gemacht hast, dann hat dieses Forum seinen Sinn und Zweck erfüllt.

- Alex
 

Koringar

Bekanntes Mitglied
Im Grunde ist es ganz Simple,

1. habe ich eine Klasse geschrieben die eine List als Variable hat und die dazu gehörigen getter(naja eher ein adder, da er die Inhalte anfügt und nicht komplett neu macht) und setter. In dieser Klasse habe ich dann noch eine Mehtode die diese Varibale auswertet, dieser Methode werden die GUI-Elemente übergeben die dann geändert werden sollen.

2 . habe ich dem dem Thread, der die Nachricht empfängt, diese Klasse im Kontruktur mit übergeben. Nun gebe ich mit dieser Übergebenen Klasse über die adder Methode die Nachricht in die List und das war alles was dieser Thread macht.

3. habe ich an der Stelle wo SWT sowie so seine eigen Endlosschleife macht (für unwissende:
while (!shell.isDisposed()){
if (!display.readAndDispatch()){
display.sleep();
}
}
) eine else if Bedingung angehängt, die überprüft ob die List leer ist. Wenn sie leer ist macht sie nichts und wenn sie mit etwas gefüllt ist springt sie dann in die unter 1. genannten Klasse und wertet die Nachricht aus. Da dieses Auswerten immer noch im Thread der GUI steckt braucht man kein syncExec und es kommt auch keine Exception.

Ich groben und ganzen wars das, habe das zwar noch etwas ausgebaut mit mehereren nebenher laufenten Threads damit die Annahme immer klappt, aber das ist ein anderes Thema ;)
 
T

tuxedo

Gast
Oha. Das klingt aber nach wie vor "unnötig". Grund:

readAndDispatch() arbeitet pro Call eine Liste mit Runnables ab. Wenn du jetzt den "Arbeitsteil", sprich das auswerten der Nachricht in solch ein Runnable mit asyncExec oder syncExec in diese Liste einreihst, wird das exakt so ausgeführt.

Das was du jetzt gemacht hast ist das "ReadAndDispatch" Rad neu erfunden und damit aus einem "Einrad" ein "Zweirad" gemacht.

Klar funktioniert das auch. "Sauberer" wäre es aber gewesen beim Einrad zu bleiben.

- Alex
 

Koringar

Bekanntes Mitglied
naja, nur das meine verarbeitung kein zusätzlicher thread ist. macht auch wirklich kein sinn (von meiner sicht her), wenn man mit syncExec eh warten muss bis er fertig ist.

ich bin gern ein mensch der auf zweirändern fährt :lol:, so mache ich immer wieder. da ich bei manchen sachen noch nicht so die erfahrung habe obs dafür schon was gibt oder nicht und da mache ich das meistens selber (damit ich das auch besser verstehe, was da passiert).

aber danke für den hinweis.
 
T

tuxedo

Gast
Man sieht dass du dich noch nicht durch die tiefen der SWT Logik gekäpmft hast.

Wenn du ein "Runnable" mittels "syncExec" oder "asyncExec" in den UI-Thread wirfst, hat das keinen neuen Thread zur Folge. Das Runnable landet in einer Liste. Und die read-and-dispatch-loop in deiner Hauptklasse, welche den Main-Thread darstellt, nimmt Durchlauf für Durchlauf ein Runnable aus der Liste raus und führt dessen "run()" Methode aus. Wäre ja sehr aufwenidg wenn die UI nicht Single-Threaded wäre ...

Du hast nun offensichtlich eine zweite Liste erstellt und machst das gleiche nochmal in grün.

Klar, du kannst das bedenkenlos so lassen. Wird nicht schneller oder langsamer dadurch. Nur hast du eben das "Rad" neu erfunden :) "Schöner" geht's mit dem bereits existierenden "Rad".

Zu "syncExec" und "asyncExec":
Da hab ich auch ne Zeitlang ein Problem gehabt zu verstehen was da letztendlich passiert. Aber wenn man's eiß ist es auf eingaml ganz einfach:

asyncExec steckt das Runnable einfach in die Liste mit anderen Runnables, welche von der read-and-dispatch-loop abgearbeitet wird. Dieses "hineinstecken" returned sofort. D.h. du wirfst das runnable einfach in den Pool und wartest nicht bis es ausgeführt wurde.

Wenn du ein syncExec ausführst, blockiert dieser Aufruf solange, bis das Runnable von der read-and-dispatch-loop ausgeführt wurde.

Das ist schon alles. Kannst dir ja mal die Sources von "Display" und "Synchronizer" anschauen. :idea:

Gruß
Alex
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
padde479 MenuItem MouseEvent/-Listener AWT, Swing, JavaFX & SWT 5
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G listener repaint() - verschiedene Darstellung AWT, Swing, JavaFX & SWT 24
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
K Warum genau hat man einen Listener, dann ein Event und was ist ein Adapter AWT, Swing, JavaFX & SWT 2
J Key-Listener in Java AWT, Swing, JavaFX & SWT 37
S JavaFX - mit Listener Veränderungen in einer TableView abhören AWT, Swing, JavaFX & SWT 3
N JavaFX 1 Listener für mehrere ChoiceBoxen AWT, Swing, JavaFX & SWT 3
B Probleme Action Listener Taschenrechner AWT, Swing, JavaFX & SWT 27
M List Listener AWT, Swing, JavaFX & SWT 37
I AWT Listener während man in anderem Fenster ist AWT, Swing, JavaFX & SWT 4
U Funktionsweise Listener AWT, Swing, JavaFX & SWT 1
L TextField Listener AWT, Swing, JavaFX & SWT 13
K Nullpointer Combobox Listener AWT, Swing, JavaFX & SWT 2
L JavaFX Image im ImageView auf Scroll Listener reagieren AWT, Swing, JavaFX & SWT 5
Salo JTabel Selection listener Bsp. AWT, Swing, JavaFX & SWT 5
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4
J Action Listener Rückgabewert AWT, Swing, JavaFX & SWT 14
MaxG. Swing JMenu einen Listener Hinzufügen AWT, Swing, JavaFX & SWT 25
L JavaFX Verbindung zwischen Beschreibung und Listener (Codebehind Klasse) AWT, Swing, JavaFX & SWT 4
T Swing Methode in Listener aufrufen AWT, Swing, JavaFX & SWT 3
S Swing Tabellen - Listener & richtige Row AWT, Swing, JavaFX & SWT 3
J Java -8 Action Listener für mehrere Buttons AWT, Swing, JavaFX & SWT 9
S Erste Schritte mit GUI - Fileverarbeitung, Listener,... AWT, Swing, JavaFX & SWT 10
M JButton - Listener AWT, Swing, JavaFX & SWT 1
R Swing Mehrere JTextFields mit einem Document Listener AWT, Swing, JavaFX & SWT 2
K JavaFX Focus Listener für gesamte Scene AWT, Swing, JavaFX & SWT 1
M Key Listener reagiert nicht AWT, Swing, JavaFX & SWT 4
F In Action Listener TextFields einlesen und prüfen. Abbruch bei falschen Eingaben. Wie mache ich das? AWT, Swing, JavaFX & SWT 2
M Listener funktioniert nicht AWT, Swing, JavaFX & SWT 7
S Swing JComboBox mit Listener aktualisieren AWT, Swing, JavaFX & SWT 13
elischa JFrame über mehrere JPanel und Listener AWT, Swing, JavaFX & SWT 17
llabusch Event Handling Listener spielt verrückt AWT, Swing, JavaFX & SWT 8
kaoZ Swing Architektonisches Problem / Listener / MVC AWT, Swing, JavaFX & SWT 14
H org.eclipse.swt.widgets.Scale MouseRelease listener AWT, Swing, JavaFX & SWT 1
MaDDin-94 Swing Listener reagiert nicht immer AWT, Swing, JavaFX & SWT 2
A JLabel im Listener färben AWT, Swing, JavaFX & SWT 11
M Key-,... Listener funktioniert nicht immer AWT, Swing, JavaFX & SWT 2
P Event Handling Listener beim öffnen von einem JPopupMenu AWT, Swing, JavaFX & SWT 3
A Listener für JGTextField AWT, Swing, JavaFX & SWT 2
J Programmierstil: Kommunikation Listener und GUI AWT, Swing, JavaFX & SWT 3
B JTable Renderer / Listener AWT, Swing, JavaFX & SWT 7
M Swing JList Listener AWT, Swing, JavaFX & SWT 20
K Action Listener implementieren über Objekt AWT, Swing, JavaFX & SWT 14
E Listener AWT, Swing, JavaFX & SWT 3
M SWING Listener ohne Wirkung AWT, Swing, JavaFX & SWT 2
P Listener Auswahl Tabelle AWT, Swing, JavaFX & SWT 6
P JPanel- Listener durch JTextArea aktivieren AWT, Swing, JavaFX & SWT 8
J Swing dragging listener AWT, Swing, JavaFX & SWT 5
H Problem mit dem Action listener.... AWT, Swing, JavaFX & SWT 2
J Frame mit Button erstellen - Warum ist es nötig, Frame über Unterklasse zu erstellen? (Reg Listener) AWT, Swing, JavaFX & SWT 2
M Fenster schließen - Listener AWT, Swing, JavaFX & SWT 5
G SWT TreeViewer - drop listener austauschen AWT, Swing, JavaFX & SWT 2
S Action Listener in innerer Klasse ausführen. AWT, Swing, JavaFX & SWT 8
J Sinn eines Selection Listener AWT, Swing, JavaFX & SWT 5
M JList mit DefaultListModel und listener AWT, Swing, JavaFX & SWT 4
M comboBox Listener? AWT, Swing, JavaFX & SWT 2
T Listener in anderen Panel deaktivieren AWT, Swing, JavaFX & SWT 3
A Swing Suche Listener für beliebige Änderung an GUI Items/Controls AWT, Swing, JavaFX & SWT 8
T SWT: Listener auf einem Button reagiert nicht AWT, Swing, JavaFX & SWT 2
L Swing JTextField Content-Listener AWT, Swing, JavaFX & SWT 4
P AWT Wie kann mein listener den Inhalt eines anderen Textfelds ändern? AWT, Swing, JavaFX & SWT 10
M Ansätze zur Kombination mehrerer Listener für Interaktion AWT, Swing, JavaFX & SWT 19
C JLabel Listener auf Textänderung? AWT, Swing, JavaFX & SWT 5
M Mouse Wheel Listener reagiert mehrmals AWT, Swing, JavaFX & SWT 5
F SWT Button listener richtig erstellen AWT, Swing, JavaFX & SWT 2
El_Lobo Swing Problem bei Methodenaufruf in innerer Klasse bei Listener AWT, Swing, JavaFX & SWT 3
S Wem füge ich welchen Listener hinzu? AWT, Swing, JavaFX & SWT 4
R Durch Listener lässt sich Programm nicht mehr ausführen AWT, Swing, JavaFX & SWT 4
T Callback vs. Event listener AWT, Swing, JavaFX & SWT 7
S Swing JTree und seine Listener... AWT, Swing, JavaFX & SWT 4
E JComboBox Listener AWT, Swing, JavaFX & SWT 2
AyKay SWT (alle) Listener bzw. ModifyEventListener entfernen AWT, Swing, JavaFX & SWT 2
S jTextField Listener AWT, Swing, JavaFX & SWT 7
E Listener, werte in andere Klasse übernehmen AWT, Swing, JavaFX & SWT 11
L Action listener in bestimmter spalte AWT, Swing, JavaFX & SWT 2
J AWT Action Listener etc. AWT, Swing, JavaFX & SWT 7
xehpuk Swing Listener für JPopupMenu AWT, Swing, JavaFX & SWT 3
F JCalendar mouseclick listener AWT, Swing, JavaFX & SWT 2
W AWT Listener bei TrayIcon AWT, Swing, JavaFX & SWT 2
K Swing Listener bei JPopupMenu AWT, Swing, JavaFX & SWT 9
E Swing JTextField Listener nach Update?! AWT, Swing, JavaFX & SWT 2
T TransformGroup Listener AWT, Swing, JavaFX & SWT 8
O Swing JTable Listener AWT, Swing, JavaFX & SWT 2
O Collection Listener AWT, Swing, JavaFX & SWT 6
L AWT Paint(g) im Listener aufrufen AWT, Swing, JavaFX & SWT 2
G JTree - Observer oder Listener? AWT, Swing, JavaFX & SWT 6
Avalarion SWT Listener auf Label oder Text Teile AWT, Swing, JavaFX & SWT 10
C Ermitteln ob JComponent einen Listener besitzt AWT, Swing, JavaFX & SWT 2
L JTextfield Listener AWT, Swing, JavaFX & SWT 3
C Listener Probleme AWT, Swing, JavaFX & SWT 6
N Listener für Variable AWT, Swing, JavaFX & SWT 4
C Swing Listener für TabPanel AWT, Swing, JavaFX & SWT 8
B Line aus Listener? AWT, Swing, JavaFX & SWT 11
G Model,Listener und background jobs AWT, Swing, JavaFX & SWT 4
1 JList - clearSelection nicht berücksichtigen im Listener AWT, Swing, JavaFX & SWT 7
I Swing Listener auf JPanel AWT, Swing, JavaFX & SWT 9
Dit_ MutableComboBoxModel | Listener fehlt ? AWT, Swing, JavaFX & SWT 6
T Swing JSlider und Adjustment-Listener wollen nicht so recht AWT, Swing, JavaFX & SWT 2
N Swing Textfield listener AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben