JLabel-"Synchronisations"-Problem

Status
Nicht offen für weitere Antworten.

sliwalker

Top Contributor
Hoi,

Ich habe ein Tool geschrieben, welches Dateien rekursiv aus Ordnern holt und in einen anderen kopiert, der so erstellt und benannt wird, wie die Dateien die kopiert werden sollen, heißen. *Omg- geht bestimmt einfacher 😉*
Soweit kein Problem.
Jetzt möchte ich, das bevor er anfängt zu kopieren, der Text eines JLabel verändert wird.
Grundsätlich ja mit setText(String) zu realisieren, doch geschieht dies erst, nachdem er alles kopiert hat.

Die betreffende Codezeile (setText) hab ich schon an die verschiedensten sinnvollen Stellen geschrieben und viel mit validate() und repaint() probiert.

Da mir die Progressbar ohne Erklärung noch ein bisschen zu "schwer" erscheint, würd ich das gerne erstmal mit dem JLabel realisieren.

Wie schaff ich das nun am Besten, dass der Text vor dem Kopiervorgang verändert wird?

Code:
        if (ae.getActionCommand().equals("sort"))
        {
            lprogress.setForeground(Color.RED);
            lprogress.setText("Kopiere spezifizierte Dateien...");
            validate(); // ?
            repaint();  // ?
             // Hier kommt noch mehr, aber unwichtig für die Frage jetzt
        }

Danke im voraus
SLi
 
Du musst Multithreading anwenden. Ein Beispiel ist hier, ansonsten in allen Javabüchern.
 
Ja Danke 😉

Auf das Beispiel wird überall verwiesen und ich habe es auch schon analysiert.
Ich hab versucht es auf mein Beispiel umzusetzen, was aber nicht geklappt hat.
Der Fortschrittsbalken schritt nicht fort.

Deswegen bin ich auf das Label umgestiegen.
Es läuft doch alles linear ab, da muss er doch, wenn ich es hinschreibe, auch den Text ändern.
Woran liegt denn das?

greetz
SLi
 
Der Thread, der eine "actionPerformed"-Methode aufruft, und der Thread der das Label zeichnet sind dieselben. Solange du den Thread in deinem Algo arbeiten lässt, kann er nicht zum Label, zeichnen gehen (Du kannst auch nicht gleichzeitig Auto fahren, und das Nummerschild auswechseln... auch wenn du eine Notiz "Nummerschild auswechseln" während dem fahren schreiben kannst).

Deshalb muss da ein Thread hin. Da nur der AWT-Thread zeichnen kann, musst der andere Thread dein Algorithmus ausführen.
 
Bei einem kleinen Tool und kurzen Status Meldungen kann man auch die Titelzeile mit setTitle() verändern, die wird schnell genug geändert, das diese noch vor dem Kopiervorgang zu sehen ist. Lohnt sich aber nur bei Tools, wo man nicht unbedingt ein Thread reinhauen möchte.

Weniger elegant, aber funktioniert: Den javax.swing.Timer verwenden. Beim Buttonklick wird nur der Text vom Label geändert und der Timer mit vielleicht 500-1000 ms (Muss man probieren, aber auch langsame Rechner berücksichtigen, gestartet. Und im ActionEvent vom Timer startet man die eigentliche Aktion.
 
Stefan1200 hat gesagt.:
Bei einem kleinen Tool und kurzen Status Meldungen kann man auch die Titelzeile mit setTitle() verändern, die wird schnell genug geändert, das diese noch vor dem Kopiervorgang zu sehen ist. Lohnt sich aber nur bei Tools, wo man nicht unbedingt ein Thread reinhauen möchte.

Weniger elegant, aber funktioniert: Den javax.swing.Timer verwenden. Beim Buttonklick wird nur der Text vom Label geändert und der Timer mit vielleicht 500-1000 ms (Muss man probieren, aber auch langsame Rechner berücksichtigen, gestartet. Und im ActionEvent vom Timer startet man die eigentliche Aktion.

Na toll :/ Text verändern, und dann noch ne Sekunde warten.
Mach lieber, was Beni geschrieben hat: to die beiden Aufrufe in ein anonymes Runnable-Object und ruf SwingUtilities.invokeAndWait auf.
 
Hoi,

Ich habe es jetzt doch mit einer Progressbar und setIndetermined(true) gelöst.
Zugegeben vielleicht die einfachste Lösung, aber es macht genau was ich mir
vorgestellt habe. Irgendwas bewegt sich während mein Programm arbeitet.

greetz
SLi
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben