Hãy xem xét các đoạn mã sau:chờ nhiều 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();
}
}
}
Dưới đây là thêm một nhãn để applet hiển thị một số kết quả trung gian của các chủ đề lao động (sử dụng xuất bản/phương pháp xử lý). Cuối cùng, nhãn được lấy ra khỏi ngăn của applet. Câu hỏi của tôi là, làm cách nào tôi có thể tạo một số nhãn, mỗi nhãn có chuỗi Công việc riêng và xóa chúng khi tất cả được thực hiện?
Xin cảm ơn trước.
UPDATE:
Tôi hy vọng điều này sẽ làm rõ câu hỏi của tôi. Tôi muốn các nhãn được gỡ bỏ tất cả cùng một lúc, khi tất cả các công nhân đã hoàn thành nhiệm vụ của họ, không phải ngay lập tức sau khi mỗi công nhân đã hoàn thành.
UPDATE 2:
Các mã sau đây có vẻ là làm những gì tôi cần. Hãy bình luận xem tôi đã làm đúng cách chưa. Tôi có cảm giác có điều gì đó sai trái. Một vấn đề là các nhãn ở bên phải của nút vẫn có thể nhìn thấy mặc dù chúng được gỡ bỏ. setVisible (false) dường như giải quyết vấn đề này. Đó có phải là cách để làm điều đó không?
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.InvocationTargetException;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.swing.*;
public class TestApplet extends JApplet
{
private Queue<JLabel> labels = new LinkedList<>();
private static final Random rand = new Random();
@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)
{
ExecutorService executor = Executors.newFixedThreadPool(10);
for(int i = 0; i < 10; i++)
{
JLabel label = new JLabel();
getContentPane().add(label);
executor.execute(new Counter(label));
}
}
});
getContentPane().add(startButton);
}
private class Counter extends SwingWorker<Void, Integer>
{
private JLabel label;
public Counter(JLabel label)
{
this.label = label;
}
@Override
protected Void doInBackground() throws Exception
{
for(int i = 1; i <= 100; i++)
{
publish(i);
Thread.sleep(rand.nextInt(80));
}
return null;
}
@Override
protected void process(List<Integer> values)
{
label.setText(values.get(values.size() - 1).toString());
}
@Override
protected void done()
{
labels.add(label);
if(labels.size() == 10)
{
while(!labels.isEmpty())
getContentPane().remove(labels.poll());
getContentPane().revalidate();
}
}
}
}
Bạn cũng có thể xem xét đặt chúng trong một danh sách ('JList'). –
@AndrewThompson, Vâng, nhưng tôi nên đặt mã sẽ chờ ở đâu? Liệu nó có phải là một SwingWorker sinh sản khác không? – Vlad
Xin đừng nuốt các ngoại lệ. – trashgod