Textlabel verändern mit parallelen Threads

julianpe

Aktives Mitglied
Hallo,

ich möchte in meinem Programm ein Textlabel während eines ausgelagerten Prozesses in einem Thread verändern.

Folgende Systematik verbirgt sich im Programm:
Bei Betätigung des Buttons Start werden nachfolgend einige Threads gestartet.
Den Zustandswechel zwischen den Threads will ich in ein Textlabel anzeigen lassen.

Folgender, teils Pseudocode liegt bereits vor:

Bei Betätigung eines Buttons wird dessen actionListener folgenden Code ausführen:

Java:
packThread pt = new packThread(StrInputPath);
                        pt.start();
                        while (pt.isAlive()==true)
                        {
                            try {
                                Thread.sleep(200);
                            } catch (InterruptedException e1) {
                                // TODO Auto-generated catch block
                                e1.printStackTrace();
                            }
                        }

Im Anschluss daran sollen dann noch andere, ähnliche Threads ausgeführt werden.

So schaut meine beispielhafte Implementierung des packThread aus:

Java:
class packThread
    extends Thread
    {

        String StrInput = null;
           
        public packThread(String StrInputFile){
            this.StrInput = StrInputFile;
               
        }
        public void run()
        {
           
   
            try {
                 System.out.println("Bilder werden gezippt");
                FolderZiper.zipFolder(StrInput, StrInput+".zip");   
                System.out.println("Bilder wurden gezipp");
             
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
           
        }
    }

Mein Ansatz war bisher, dass ich den Statuswechsel direkt im try Abschnitt des jeweiligen Threads vollziehen wollte. So funktioniert es ja schließlich auch mit dem System.out.println, jedoch nicht mit dem setText() Argument meines Labels.

Wie kann ich mein Code dahingehend umbauen, sodass vor und nach jedem Thread-Aufruf das Textlabel verändert werden kann?
 
Müssen must du gar nichts. Du kannst auch mit InvokeLater arbeiten. Aber es wäre halt einfach der sauberere Code einen Swingworker zu nehmen. Ich arbeite zu 99% damit, da man eigentlich immer seinen Code im Hintergrund laufen lassen sollte um das UI nicht zu blockieren.

Lies Dich doch einfach mal in den Swingworker ein statt auf irgendeinen Tip zu hoffen der nur dazu führt das du auch weiterhin schlechten Code produzierst.
 
Hallo nochmal,

ich habe mich jetzt ein wenig in das Thema eingearbeitet und habe meinen Code folgendermaßen aufgebaut:

Java:
public class MainFrame extends JFrame {

public final JLabel lblStatus = new JLabel("");

public static void main(String[] args) {
               
    SwingUtilities.invokeLater(new Runnable() {
              @Override
              public void run() {
                MainFrame frame = new MainFrame();
              }
            });
    }
   
public MainFrame() {
        btnStart.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                zipFileHelper(StrInputPath,StrOutputPath);
                });
}   

public void encryptFileHelper(String StrInputPath,String StrOutputPath)
            {
                zipPicture zp = new zipPicture(StrInputPath, StrOutputPath);
                ef.execute();
            }

class zipPicture extends SwingWorker<Void, Void>
{
    String StrInput = null;
    String StrOutput = null;
    zipPicture(String StrInputPath,String StrOutputPath) {
        this.StrInput=StrInputPath;
        this.StrOutput=StrOutputPath;
    
    }
    public Void doInBackground()
    {
            try {
                zipHandler.zipFiles(StrInput, StrOutput);
            } catch (ExtendedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
           
        return null;
    }
   
    protected void done() {


        lblStatus.setText("Zippen beendet");
        System.out.println("Zippen beendet");
         }
}

Das Fenster friert trotzdem weiterhin ein. Ist daran zu erkennen, dass der Start Button nach dem Betätigen weiterhin gedrückt ist. Auch werden die Änderungen im JLabel nicht eingetragen.

Ist denn mein o.g. Ansatz grundsätzlich falsch?
 

Zurück
Oben