perche il seguente frammento di codice:attesa per più 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();
}
}
}
Ecco aggiungere un'etichetta per l'applet che mostra alcuni risultati intermedi del filo lavoratore (usando pubblica/metodi di lavorazione). Alla fine, l'etichetta viene rimossa dal riquadro dell'applet. La mia domanda è: come posso creare diverse etichette, ognuna con il proprio thread di lavoro, e rimuoverle quando sono tutte fatte?
Grazie in anticipo.
UPDATE:
Spero che questo permetterà di chiarire la mia domanda. Mi piacerebbe che le etichette venissero rimosse tutte in una volta, quando tutti i lavoratori hanno finito i loro compiti, non immediatamente dopo che ciascun lavoratore ha finito.
UPDATE 2:
Il seguente codice sembra stia facendo quello che mi serve. Si prega di commentare se l'ho fatto nel modo giusto. Ho la sensazione che ci sia qualcosa di sbagliato. Un problema è che le etichette a destra del pulsante rimangono visibili anche se vengono rimosse. setVisible (false) sembra risolvere questo problema. È questo il modo di farlo?
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();
}
}
}
}
si potrebbe anche prendere in considerazione la loro messa in un elenco ('JList'). –
@AndrewThompson, Sì, ma dove dovrei posizionare il codice che li aspetterà? Dovrebbe essere un altro SwingWorker che genera altri? – Vlad
Si prega di non ingoiare le eccezioni. – trashgod