|
|
|
![]() |
|
Strumenti |
![]() |
#21 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
nel post precedente il compilatore rileva il while(true) e capisce che quel metodo non restituirà mai il controllo, rendendo superfluo un return che non sarà mai eseguito. E' una volpe
![]() Nel secondo caso non c'è una condizione assimilabile quindi il compilatore pretende giustamente un valore restituito. Il return null è imposto dal tipo restituito dal metodo doInBackground: Void, con la V maiuscola, che è il contraltare riflessivo del void con la v minuscola. Esiste un unico valore compatibile con Void è ed null, da cui il return null.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#22 |
Senior Member
Iscritto dal: Jan 2008
Messaggi: 11151
|
Capisco, non immaginavo tenesse conto di queste piccolezze.
Grazie ancora! ![]()
__________________
~
|
![]() |
![]() |
![]() |
#23 |
Senior Member
Iscritto dal: Jan 2008
Messaggi: 11151
|
Questa volta non ho niente da chiedere, volevo semplicemente aggiungere una implementazione piu` completa e funzionale dello SwingWorker di prima (magari puo` essere utile a qualcuno, chissa`!). Il JButton ora non viene piu` disabilitato, ma una volta premuto, cambia funzionalita` e permette di annullare l'operazione in corso mediante cancel().
Il metodo doInBackground() dopo essere stato terminato da cancel() passa il controllo per le operazioni finali a done(). Devo ammettere che tutto sommato SwingWorker usato cosi` e` piuttosto pratico ed elegante. Peccato per il bug irrisolto. Codice:
startButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { new SwingWorker<Void, Void>() { @Override public Void doInBackground() { statusLabel.setText("Status: working"); startButton.setText("Cancel"); startButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { cancel(true); } }); while((progress.getValue() < 100) || (!isCancelled())) { try { Thread.sleep(rand.nextInt(100)); publish(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } return null; } @Override protected void process(List<Void> chunks) { progress.setValue(progress.getValue() + 1); } @Override protected void done() { if(!isCancelled()) statusLabel.setText("Status: done!"); else statusLabel.setText("Status: canceled"); startButton.setText("Quit"); startButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.exit(0); // Temporary implementation } }); } }.execute(); } }); EDIT2: Un'altra nota. L'ordine di verifica delle condizioni qui evidenziate pare essere piuttosto importante: Codice:
while((progress.getValue() < 100) || (!isCancelled())) { try { Thread.sleep(rand.nextInt(100)); publish(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } Cosi` come l'ho scritto in ogni caso funziona correttamente, ma ho l'impressione che ci sia qualcosa che non vada. Ad esempio se uso && (come comunque il caso dovrebbe suggerire) al posto di || l'avanzatore continua a proseguire, al pulsante non viene cambiato il testo come dovrebbe, ma premendolo due volte (?) l'applicazione termina come dovrebbe. EDIT3: Risolto ![]() L'origine dei problemi era che mi ero scordato di rimuovere dal JButton gli EventListener pre-assegnati prima di assegnarne di nuovi. Non immaginavo che se ne potesse assegnare piu` di uno contemporaneamente.
__________________
~
Ultima modifica di s12a : 07-05-2010 alle 01:11. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:09.