ホームページ >Java >&#&チュートリアル >JApplet で複数の SwingWorker スレッドとそれに関連付けられたラベルを管理するにはどうすればよいですか?
次のコード部分を考えてみましょう:
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(); } } }
ここでの目標は、次のことを追加することです。ワーカー スレッドの中間結果を表示するアプレットのラベル (パブリッシュ/プロセス メソッドを使用)。最後に、ラベルはアプレットのペインから削除されます。問題は、それぞれに独自のワーカー スレッドを持つ複数のラベルをどのように作成し、すべてのラベルが完了したら削除できるかということです。
このコンテキストでは CountDownLatch が適切に機能します。以下の例では、各ワーカーは完了時に latch.countDown() を呼び出し、スーパーバイザー ワーカーはすべてのタスクが完了するまで latch.await() をブロックします。デモンストレーションの目的で、スーパーバイザはラベルを更新します。コメントに示されている大規模な削除は技術的には可能ですが、一般的には魅力的ではありません。代わりに、JList または JTable を検討してください。
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();
以上がJApplet で複数の SwingWorker スレッドとそれに関連付けられたラベルを管理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。