que - swingworker java ejemplo
¿Parar/cancelar el hilo de SwingWorker? (4)
Estoy tratando de averiguar cómo detener la ejecución de un subproceso de SwingWorker cuando presiono un botón. He estado mirando alrededor y estoy teniendo problemas para encontrar la forma de hacerlo. Por el momento esto es lo que tengo:
new MySwingWorkerClass(args).execute();
Luego estoy creando un botón que quiero usar para detener el hilo:
button = new JButton("Stop");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
// Stop the swing worker thread
}
});
Ya he buscado en todas partes en busca de una respuesta, hasta ahora he logrado encontrar el método de cancelación. Sin embargo, no entiendo cómo usar esto para detener a mi trabajador de swing. Intenté lo siguiente pero no funcionó:
SwingWorker.cancel(true);
Creo que tienes que reiniciar el contador después de cada parada.
Para startButton, debe reiniciarse el trabajo como en
private JButton startButton = new JButton(new AbstractAction("Start") {
@Override
public void actionPerformed(ActionEvent arg0) {
if(!isStarted) {
worker = new Worker(); // New line
worker.execute();
isStarted = false;
}
}
});
Para detenerlo puedes usar
worker.setStopFlag(); // in stopButton actionPerformed block.
en clase trabajadora private boolean stopFlag = false;
y añadir
if( stopFlag)
break;
después de Thread.sleep (60); y finalmente poner setter para stopFlag al final de la clase Worker como
void setStopFlag(){
stopFlag = true;
}
Por cierto, puede usar cancel (true) si quiere que la excepción salga.
Debe mantener una referencia a su SwingWorker, luego usa esa referencia para cancelar el hilo de trabajo.
MySwingWorker myWorker = new MySwingWorkerClass(args).execute();
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
// Stop the swing worker thread
myWorker.cancel(true);
}
});
Aquí hay un ejemplo completo:
public class WorkerDemo extends JFrame {
private boolean isStarted = false;
private JLabel counterLabel = new JLabel("Not started");
private Worker worker = new Worker();
private JButton startButton = new JButton(new AbstractAction("Start") {
@Override
public void actionPerformed(ActionEvent arg0) {
if(!isStarted) {
worker.execute();
isStarted = false;
}
}
});
private JButton stopButton = new JButton(new AbstractAction("Stop") {
@Override
public void actionPerformed(ActionEvent arg0) {
worker.cancel(true);
}
});
public WorkerDemo() {
add(startButton, BorderLayout.WEST);
add(counterLabel, BorderLayout.CENTER);
add(stopButton, BorderLayout.EAST);
pack();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
class Worker extends SwingWorker<Void, Integer> {
int counter = 0;
@Override
protected Void doInBackground() throws Exception {
while(true) {
counter++;
publish(counter);
Thread.sleep(60);
}
}
@Override
protected void process(List<Integer> chunk) {
// get last result
Integer counterChunk = chunk.get(chunk.size()-1);
counterLabel.setText(counterChunk.toString());
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new WorkerDemo();
}
});
}
}
Necesita verificar periódicamente su isCancelled()
cancelada (es decir, está isCancelled()
). SwingWorker
deja cómo manejar la interrupción hasta usted.
Para obtener más información, vea Cancelar tareas en segundo plano .
puedes intentar sobreescribir el método done () y ponerlo en try catch y atrapar java.util.concurrent.CancellationException. Algo como
. . .
@Overide
done() {
try {
get();
} catch (CancellationException e) {
// Do your task after cancellation
}
}
. . .