Salve,
premetto che uso JSE 5 che non aveva inclusa SwingWorker, che ho scaricato dal sito del progetto quindi non so se sia uguale al 100% (ma penso di si) con JSE 6. Detto ciò:
Allora sto facendo un operazione di test lanciata con SwingWorker. Tutto ok nessun problema mi parte in background l'operazione e siamo tutti felici e contenti.
Ora,volevo implementare nel JForm che lancia questa applicazione, i classici pulsanti STOP e CONTINUE. Scartabellando per internet l'unica soluzione che sono riuscito ad implementare è quella di inserire nella mia classe una variabile di stop e settare a true/false quella attraverso i pulsanti STOP e CONTINUE. Questo è il risultato:
dove i pulsanti STOP e CONTINUE nella jFrame vanno a richiamare le funzioni pause() e restart() di TestTaskcodice:public class TestTask extends SwingWorker<Void, Void> { private boolean stopped = false; @Override protected Void doInBackground() throws Exception { Random random = new Random(); int progress = 0; //Initialize progress property. setProgress(0); //Sleep for at least one second to simulate "startup". try { Thread.sleep(1000 + random.nextInt(2000)); } catch (InterruptedException ignore) { } while (progress < 100 && !isCancelled()) { if (!stopped) { //<------- CONTROLLO CHE NON SIA STATO MESSO IN PAUSA //Sleep for up to one second. try { Thread.sleep(random.nextInt(1000)); } catch (InterruptedException ignore) { } //Make random progress. progress += random.nextInt(10); setProgress(Math.min(progress, 100)); } } return null; } public void pause(){ stopped=true; } public void restart(){ stopped=false; } }
Mi chiedevo: ma da 1 a 10 fa schifo 100 questa soluzione, oppure è effettivamente un modo affermato di procedere? Avevo pensato ad usare wait() e notify(), solo che non riesco a gestirli perchè se chiamo wait cmq mi blocca tutto quanto (thread principale) e quindi l'applicazione non risponde piu.
Grazie per gli eventuali consigli

Rispondi quotando
