2017-10-12 5 views
2

Ich weiß, viele Menschen haben vor diese Frage gestellt, aber ich konnte keine Antwort finden, dass mein Problem gelöst. Mein Code ist wie folgt:Wert von JLabel nicht mit setText aktualisiert() in Java

public void mouseClicked(MouseEvent arg0) { 
    TEXT.setText("ON"); 
    myfunction(); //runs for a very long time 
} 

Der Originaltext JLabel ist "OFF". Jetzt möchte ich den Text "ON" ändern, wenn die Maus geklickt wird, aber der Text nicht gesetzt, bis myfunction() abgeschlossen ist (das kann einige Minuten dauern).

Ich habe die invalidate Funktion versucht, eine eigene Funktion machen den Text für die Einstellung, aber nichts funktioniert.

Bitte helfen Sie mir mit diesem Problem!

+1

Sie myfunction() in einem separaten Thread ausgeführt werden müssen, wenn möglich, . Was macht meine Funktion()? –

+0

Es erhält Daten über Ethernet und fügt es der Datenbank hinzu. Ich möchte Threads vermeiden ... – KulaDamian

+0

gibt es keine Möglichkeit um Threads herum. Schreiben von gutem Code mit Swing beinhaltet immer die Verwendung von Threads in der einen oder anderen Form. Lies meine Antwort, wo ich es im Detail erkläre. –

Antwort

2

Das Problem ist, dass mouseClicked(...) auf dem UI Thread ausgeführt wird. Das ist die Thread, die verantwortlich ist für die Behandlung aller Arten von Benutzeraktionen (wie ein Mausklick) und auch das Zeichnen von Komponenten (wie das Aktualisieren des Textes des Etiketts auf dem Bildschirm). Wenn Sie den Aufruf der Methode mit langer Laufzeit für den Benutzeroberflächenthread ausführen, wird dieser blockiert und kann erst dann gezeichnet werden, wenn die Ausführung abgeschlossen ist. Sie müssen multi threading verwenden, um dieses Problem zu umgehen.

Nachfolgend könnte die eleganteste Lösung nicht sein, aber wenn Sie neu Einfädeln auf Multi es die Arbeit erledigt bekommen:

public void mouseClicked(MouseEvent arg0) { 
    TEXT.setText("ON"); 
    (new Thread() { 
     public void run() { 
      myfunction(); 
     } 
    }).start(); 
} 

Es wird eine neue Thread laichen, die Ihre Methode behandelt, die lassen wird die UI Thread macht weiter so. Sehen Sie die Taste deaktivieren, die gerade geklickt hat, so dass der Benutzer nicht die Ausführung beginnen kann, während es bereits im Gange ist (was in der Regel ist das, was Sie wollen ..)