Heim >Java >javaLernprogramm >Wie verwalte ich mehrere SwingWorker-Threads und die zugehörigen Labels in einem JApplet?

Wie verwalte ich mehrere SwingWorker-Threads und die zugehörigen Labels in einem JApplet?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-20 02:33:08590Durchsuche

How to Manage Multiple SwingWorker Threads and Their Associated Labels in a JApplet?

Warten auf mehrere SwingWorker

Problem

Betrachten Sie das folgende Codefragment:

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.InvocationTargetException;
import javax.swing.*;

public class TestApplet extends JApplet
{
    @Override
    public void init()
    {
        try
        {
            SwingUtilities.invokeAndWait(new Runnable()
            {
                @Override
                public void run()
                {
                    createGUI();
                }
            });
        }
        catch(InterruptedException | InvocationTargetException ex)
        {
        }
    }

    private void createGUI()
    {
        getContentPane().setLayout(new FlowLayout());
        JButton startButton = new JButton("Do work");
        startButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent ae)
            {
                JLabel label = new JLabel();
                new Worker(label).execute();
            }
        });
        getContentPane().add(startButton);
    }

    private class Worker extends SwingWorker<Void, Void>
    {
        JLabel label;

        public Worker(JLabel label)
        {
            this.label = label;
        }

        @Override
        protected Void doInBackground() throws Exception
        {
            // do work
            return null;
        }

        @Override
        protected void done()
        {
            getContentPane().remove(label);
            getContentPane().revalidate();
        }
    }
}

Hier ist das Ziel das Hinzufügen eine Bezeichnung für das Applet, die einige Zwischenergebnisse des Worker-Threads anzeigt (unter Verwendung von Publish/Process-Methoden). Am Ende wird die Beschriftung aus dem Applet-Bereich entfernt. Die Frage ist, wie könnte man mehrere Labels erstellen, jedes mit seinem eigenen Worker-Thread, und diese entfernen, wenn sie alle fertig sind?

Lösung

Ein CountDownLatch funktioniert in diesem Zusammenhang gut. Im folgenden Beispiel ruft jeder Worker nach Abschluss die Funktion „latch.countDown()“ auf, und ein Supervisor-Worker blockiert die Funktion „latch.await()“, bis alle Aufgaben abgeschlossen sind. Zu Demonstrationszwecken aktualisiert der Supervisor die Etiketten. Die in Kommentaren gezeigte Massenentfernung ist technisch möglich, aber im Allgemeinen unattraktiv. Ziehen Sie stattdessen eine JList oder JTable in Betracht.

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.swing.*;

/**
* @see https://stackoverflow.com/a/11372932/230513
* @see https://stackoverflow.com/a/3588523/230513
*/
public class WorkerLatchTest extends JApplet {

    private static final int N = 8;
    private static final Random rand = new Random();
    private Queue<JLabel> labels = new LinkedList<JLabel>();
    private JPanel panel = new JPanel(new GridLayout(0, 1));
    private JButton startButton = new JButton(new StartAction("Do work"));

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame frame = new JFrame();

Das obige ist der detaillierte Inhalt vonWie verwalte ich mehrere SwingWorker-Threads und die zugehörigen Labels in einem JApplet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn