>Java >java지도 시간 >JApplet에서 여러 SwingWorker 스레드 및 관련 레이블을 관리하는 방법은 무엇입니까?

JApplet에서 여러 SwingWorker 스레드 및 관련 레이블을 관리하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-20 02:33:08563검색

How to Manage Multiple SwingWorker Threads and Their Associated Labels in a 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();
        }
    }
}

여기서 목표는 추가하는 것입니다. 작업자 스레드의 일부 중간 결과를 표시하는 애플릿에 대한 레이블입니다(게시/처리 방법 사용). 마지막에는 애플릿 창에서 레이블이 제거됩니다. 문제는 어떻게 각각 자체 Worker 스레드가 있는 여러 개의 레이블을 생성하고 모두 완료되면 제거할 수 있느냐는 것입니다.

해결책

CountDownLatch는 이러한 맥락에서 잘 작동합니다. 아래 예에서 각 작업자는 완료 시 래치.countDown()을 호출하고 감독자 작업자는 모든 작업이 완료될 때까지 래치.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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.