ホームページ >Java >&#&チュートリアル >JApplet で複数の SwingWorker スレッドとそれに関連付けられたラベルを管理するにはどうすればよいですか?

JApplet で複数の SwingWorker スレッドとそれに関連付けられたラベルを管理するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-20 02:33:08560ブラウズ

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

複数の SwingWorkers を待機しています

問題

次のコード部分を考えてみましょう:

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。