다음 코드 조각을 고려하세요.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!