Hallo zusammen,
ich habe mal wieder ein kleines Problem. Es trat während der Entwicklung einer kleinen Anwendung auf, aber lässt sich auch an einem einfacher zu erklärenden Beispiel beobachten.
Ich habe ein GUI mit einem JButton und einem JLabel. Wenn ich den Button drücke, wird eine Schleife gestartet, in der jedes mal die setText()-Methode des Labels aufgerufen wird, mit der Laufvariablen der Schleife als Argument (natürlich als String). Also sollte doch das Label bei jeder Iteration der Schleife aktualisiert werden und den aktuellen Wert der Laufvariablen zeigen, oder?
Es ist aber so, dass der Button nach dem Drücken „unten“ hängenbleibt, wieder hochkommt, wenn die Schleife terminiert, und dann auch der letzte Wert der Laufvariablen im Label angezeigt wird.
Wie kann ich es jetzt hinbekommen, dass diese Aktualisierung nicht aufgehoben wird, bis die Schleife terminiert, sondern bei jeder Iteration erfolgt?
Beste Grüße
Schorsch
Moin
Ich habe ein GUI mit einem JButton und einem JLabel. Wenn ich
den Button drücke, wird eine Schleife gestartet, in der jedes
mal die setText()-Methode des Labels aufgerufen wird, mit der
Laufvariablen der Schleife als Argument (natürlich als
String). Also sollte doch das Label bei jeder Iteration der
Schleife aktualisiert werden und den aktuellen Wert der
Laufvariablen zeigen, oder?
Nein, das wird nicht passieren da du den AWT-Thread blockierst:
Der AWT-Thread ist für alles zustätig was malen und updaten der GUI sowie alle AWT-events (buttons, keylistener, Mouse…) angeht. Dieser Thread ruft deinen Evenhadler auf und führt deine Schleife aus. D.h. der Thread ist beschäftigt. Solange er beschäftigt ist bleibt die GUI unverändert liegen.
D.h. du musst einen eigenen Thread erzeugen und den die Schleife durchackern lassen.
cu
Hallo.
Also, einfach mal so ins Blaue geraten:
Starte in dem Button-Actionhandler einen neuen Thread, der deine Schleife beinhaltet und dann die GUI aktualisiert. Evtl. musst du noch ein sleep einbauen, falls die GUI zu träge ist.
Viel Erfolg wünscht…
Chris
Hallo,
und danke für die Antwort. Aber habe ich jetzt nicht ein kleines Problem? Ich habe Klasse A mit dem Actionlistener und dem GUI, und Klasse B, die ich von Thread ableite und die mir die Schleife durchackert. Klasse A hat eine Instanz von Klasse B. Jetzt kann ich, wenn ich aufs Knöpfle von A drücke, B losrennen lassen, kein Problem. Aber ich muss ja irgendwie die Werte aus B in A bekommen, um sie von dort aus ins GUI zu setzen. Das kann ich aber doch nicht über eine set-Methode in B machen, die auf die Elemente in A zugreift, weil B ja von gar nichts weiss. Und eine get-Methode in B, die ich von A aufrufe, bringt mir ja auch nichts, weil A ja garnicht weiss, was B macht und wie weit er damit ist. Wie bekomme ich denn die Werte aus B in A?
Hier mal der Code von meinen beiden Beispielklassen, vielleicht bringts ja was. „TestGUI“ entspricht „A“ (hat momentan auch noch die Schleife), „TestThread“ „B“:
public class TestGUI extends javax.swing.JFrame {
TestThread test;
public TestGUI() {
…*Layout*…
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
System.out.println(„Schleife gestartet“);
for (int i = 0; i
Hallo,
was hindert Dich daran, B die Referenz auf A mitzugeben. Z.B. im Konstruktor? Dafür gibts doch schließlich das Schlüsselwort „this“.
Das kannst Du allerdings nicht im ActionListener machen. Dazu musst Du erst eine Objektmethode aufrufen und von der aus new B(this).
Gruß
Peter
1 „Gefällt mir“
mercy, mercy, mercy… lalala
Wunderbar,
das klappt jetzt so ganz ausgezeichnet. Und weil ich mich so freue, dass es endlich geht, bekommt ihr alle drei 'n Sternchen.
Danke vielmals.
Freudige Grüße
Schorsch 
Hallo,
das Problem läßt sich mit SwingWorker lösen. Dazu die folgenden Links:
Gruß,
Frank