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?
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!