sirve que progressbar para ejemplo java swing swingworker

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(); } }); } }



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 } }

. . .