Discussione:
SwingWorker e oggetto ritornato
(troppo vecchio per rispondere)
mdema@diesel
2008-06-30 14:35:09 UTC
Permalink
Ciao a tutti,
cm da oggetto il mio problema riguarda un oggetto
SwingWorker<String,Void> e la stringa che DOVREBBE restituire.
Posto che ho letto il tutorial di Swing sul sito della Sun, ma non ho
ancora ben chiaro COME usare uno swingworker, vi mostro il codice che ho
buttato giu:

SwingWorker worker = new SwingWorker<String,Void>(){

@Override
protected String doInBackground() throws
Exception {

String plot =
PlotGetter.getPlotfromTitle((String)DBTable.getValueAt(DBTable.getSelectedRow(),
0));

return plot;
}

@Override
protected void done(){
try {
txtarea.setText(get());
if(txtarea.equals("Non
trovato!")){btnSavePlot.setEnabled(false);
JOptionPane.showMessageDialog(null,"NON TROVATO!");}
else btnSavePlot.setEnabled(true);
} catch (InterruptedException ex) {

Logger.getLogger(GetPlotsView.class.getName()).log(Level.SEVERE, null, ex);
} catch (ExecutionException ex) {

Logger.getLogger(GetPlotsView.class.getName()).log(Level.SEVERE, null, ex);
}
}
};

Solo che quando faccio partire il tutto, il thread parte (visto ke la
gui nn si blocca) ma non ritorna mai nulla. Immagino il problema sia o
che non ho assolutamente capito come si usa questa classe, o che non
posso fare la chiamata a PlotGetter.getPlotFromTitle(..)....
Voi cosa ne pensate??
Grazie mille

Ciao
Andrea Francia
2008-06-30 21:03:59 UTC
Permalink
Post by ***@diesel
Ciao a tutti,
cm da oggetto il mio problema riguarda un oggetto
SwingWorker<String,Void> e la stringa che DOVREBBE restituire.
Posto che ho letto il tutorial di Swing sul sito della Sun, ma non ho
ancora ben chiaro COME usare uno swingworker, vi mostro il codice che ho
La prossima volta cerca di formattarlo perché sia piu' semplice
visualizzarlo su usenet.
Per esempio usa l'indentazione a 2 spazi e non far partire il codice
dalla 20-esima colonna.
Post by ***@diesel
SwingWorker worker = new SwingWorker<String,Void>(){
@Override
protected String doInBackground() throws
Exception {
String plot =
PlotGetter.getPlotfromTitle((String)DBTable.getValueAt(DBTable.getSelectedRow(),
0));
return plot;
}
@Override
protected void done(){
try {
txtarea.setText(get());
if(txtarea.equals("Non
trovato!")){btnSavePlot.setEnabled(false);
JOptionPane.showMessageDialog(null,"NON TROVATO!");}
else btnSavePlot.setEnabled(true);
} catch (InterruptedException ex) {
Logger.getLogger(GetPlotsView.class.getName()).log(Level.SEVERE, null, ex);
} catch (ExecutionException ex) {
Logger.getLogger(GetPlotsView.class.getName()).log(Level.SEVERE, null, ex);
}
}
};
Solo che quando faccio partire il tutto, il thread parte (visto ke la
gui nn si blocca)
Il fatto che la gui non si blocca non significa che il tread parte,
potrebbe anche significare anche che il tread non è partito.

Per verificare che parte compila in debug e metti un breakpoint dentro
doInBackground().
Post by ***@diesel
ma non ritorna mai nulla.
Nel senso che rimane appeso o che lancia un'eccezione?
Post by ***@diesel
Immagino il problema sia o
che non ho assolutamente capito come si usa questa classe, o che non
posso fare la chiamata a PlotGetter.getPlotFromTitle(..)....
Io non conosco questa classe ma posso darti questo consiglio, vai a
cercarti il tutorial più semplice che trovi, scaricatelo e fallo
fuzionare. Poi modifica (e testa) il tutorial un po' alla volta fino ad
ottenere il comportamento desiderato.

E' il modo migliore per riuscire a capire le classi che ti risultano
troppo complicate da essere capite solo leggendo la documentazione.

I beansbinding che mi sembravano super complicati li ho imparati così.
Post by ***@diesel
Voi cosa ne pensate??
Che manca il pezzo di codice che chiama il codice che hai postato e che
dovresti semplificare l'esempio.

La semplificazione sarebbe utile per due motivi:
- è piu' probabile che qualcuno ti risponda quando il codice è minimale
- è probabile che trovi da solo l'errore durante la semplificazione.

Se non hai ancora capito bene come funziona lo SwingWorker fanne uno che
non fa niente e restituisce una stringa predefinita.
Poi quando vedi che funziona aggiungi una alla volta le feature che ti
servono per avere la classe finale.
Post by ***@diesel
Grazie mille
Ciao
--
Andrea Francia
http://andreafrancia.blogspot.com/2008/06/relazioni-molti-molti-con-jpa.html
mdema@diesel
2008-07-01 15:05:29 UTC
Permalink
Post by Andrea Francia
La prossima volta cerca di formattarlo perché sia piu' semplice
visualizzarlo su usenet.
Per esempio usa l'indentazione a 2 spazi e non far partire il codice
dalla 20-esima colonna.
Su questo hai assolutamente ragione....
Post by Andrea Francia
Post by ***@diesel
ma non ritorna mai nulla.
Nel senso che rimane appeso o che lancia un'eccezione?
Nel senso che rimane "appeso".
Post by Andrea Francia
Se non hai ancora capito bene come funziona lo SwingWorker fanne uno che
non fa niente e restituisce una stringa predefinita.
Il problema è che ho già provato con i tutorial più semplici
possibile....boh, immagino mi sfugga qualcosa....riproverò.

Quando dici che "manca il codice che chiama ciò che ho postato, intendi
dire che dovrei fare una chiamata di qualche tipo per avere i dati di
risposta?? Io avevo capito che, implementando il metodo done() l'avrebbe
direttamente fatto lo SwingWorker, una volta avesse finito....
Grazie ancora per l'aiuto

Ciao
Andrea Francia
2008-07-01 15:47:34 UTC
Permalink
Post by ***@diesel
Quando dici che "manca il codice che chiama ciò che ho postato, intendi
dire che dovrei fare una chiamata di qualche tipo per avere i dati di
risposta?? Io avevo capito che, implementando il metodo done() l'avrebbe
direttamente fatto lo SwingWorker, una volta avesse finito....
Non conosco SwingWorker e non capisco come avvenga il passaggio dal
click dell'utente all'avvio dello SwingWorker.

Non so se non lo capisco perché non conosco SwingWorker o perché manca
del codice che hai postato.

Vedo che il tuo codice è così:

SwingWorker worker = new SwingWorker() {
...
};

Dopo di questo mi aspettavo di vedere qualcosa del tipo:

worker.start();

Oppure worker.run(), dato che non conosco swingworker non so il nome del
metodo.
--
Andrea Francia
http://www.andreafrancia.it/
mdema@diesel
2008-07-01 16:09:31 UTC
Permalink
Post by Andrea Francia
worker.start();
Oppure worker.run(), dato che non conosco swingworker non so il nome del
metodo.
Avevi ragione, ovviamente....
Il fatto che non avessi capito come funzionava la classe, mi aveva
impedito di capire in effetti quello che stavo facendo.
Il tutorial di sun faceva riferimento al codice completo del programma
d'esempio...e io QUELLO non l'avevo letto....
Ho dato un occhio ed in effetti adesso so che devo semplicemente scrivere:

worker.execute();

Adesso funziona, ma devo testarlo un po'....non sono sicuro di non avere
scritto che può inaspettatamente inchiodarsi per problemi di concorrenza...
Grazie mille per l'aiuto.
Al prossimo post ;)
Ciao

Loading...