View Full Version : [Java] Problema di comunicazione tra classi
Ciao a tutti,
il mio problema è relativo ad una classe che svolge il suo lavoro fino ad arrivavare alla seguente riga di codice:
new GeneraEventoNuovaVendita(idVendita, jTable1.getValoreAt(i, 2).toString(), jTable1.getValoreAt(i, 4).toString(), jTable1.getValoreAt(i, 3).toString());
ora GeneraEventoNuovaVendita fa scatenare diversi tipi di elaborazione e registrazioni su db...quello che mi servirebbe sapere è se tutto quello che è stato "scatenato" ha avuto successo e mi serve saperlo nella classe che fa partire la GeneraEventoNuovaVendita ecc.
public class GeneraEventoNuovaVendita extends java.awt.Component {
/** Creates a new instance of GeneraEventoNuovaVendita */
public GeneraEventoNuovaVendita(String str, String quantita, String prezzo, String provv) {
EventQueue evq = Toolkit.getDefaultToolkit().getSystemEventQueue();
evq.postEvent(new EventoNuovaVendita(this, str, quantita, prezzo, provv));
enableEvents(0);
}
public void processEvent(AWTEvent evt){
if (evt instanceof EventoNuovaVendita)
GestoreListeners.gestisciNuovaVendita(evt);
}
}
io a ho provato a fare delle prove e riesco ad ottenere un true o false a livello di GeneraEventoNuovaVendita ma poi non riesco più a comunicarlo indietro :muro: idee?
^TiGeRShArK^
13-03-2009, 15:28
Ciao a tutti,
il mio problema è relativo ad una classe che svolge il suo lavoro fino ad arrivavare alla seguente riga di codice:
new GeneraEventoNuovaVendita(idVendita, jTable1.getValoreAt(i, 2).toString(), jTable1.getValoreAt(i, 4).toString(), jTable1.getValoreAt(i, 3).toString());
ora GeneraEventoNuovaVendita fa scatenare diversi tipi di elaborazione e registrazioni su db...quello che mi servirebbe sapere è se tutto quello che è stato "scatenato" ha avuto successo e mi serve saperlo nella classe che fa partire la GeneraEventoNuovaVendita ecc.
public class GeneraEventoNuovaVendita extends java.awt.Component {
/** Creates a new instance of GeneraEventoNuovaVendita */
public GeneraEventoNuovaVendita(String str, String quantita, String prezzo, String provv) {
EventQueue evq = Toolkit.getDefaultToolkit().getSystemEventQueue();
evq.postEvent(new EventoNuovaVendita(this, str, quantita, prezzo, provv));
enableEvents(0);
}
public void processEvent(AWTEvent evt){
if (evt instanceof EventoNuovaVendita)
GestoreListeners.gestisciNuovaVendita(evt);
}
}
io a ho provato a fare delle prove e riesco ad ottenere un true o false a livello di GeneraEventoNuovaVendita ma poi non riesco più a comunicarlo indietro :muro: idee?
metterlo in un field e accedervi dalla classe padre? :fagiano:
o ancora meglio levarlo dal costruttore e metterlo in un metodo public boolean ? :stordita:
si era la mia idea, ho fatto questa modifica:
public class GeneraEventoNuovaVendita extends java.awt.Component {
private static boolean successo;
/** Creates a new instance of GeneraEventoNuovaVendita */
public GeneraEventoNuovaVendita(String str, String idArticolo, String quantita, String prezzo, String provv) {
EventQueue evq = Toolkit.getDefaultToolkit().getSystemEventQueue();
evq.postEvent(new EventoNuovaVendita(this, str, idArticolo, quantita, prezzo, provv));
enableEvents(0);
}
@Override
public void processEvent(AWTEvent evt) {
if (evt instanceof EventoNuovaVendita)
try {
GestoreListeners.gestisciNuovaVendita(evt);
successo = true;
} catch (AWTException ex) {
ex.printStackTrace();
successo = false;
}
}
public boolean getSuccesso() {
return successo;
}
}
successo viene inizializzato correttamente, quando però uso getSuccesso() dalla classe padre ottengo sempre false.....:muro:
...un esempio vale piu' di mille parole...
...classe principale...
public class ClassePrincipale {
public static void main(String[] args) {
new ClassePrincipale();
}
public ClassePrincipale(){
ClasseFunzione classeFunzione = new ClasseFunzione();
//eseguo il metodo della classe funzione
classeFunzione.metodoClasseFunzione();
//eseguo lo stesso metodo e scrivo a console il valore restituito
System.out.println(classeFunzione.metodoClasseFunzione());
}
}
...classe funzione...
public class ClasseFunzione {
public ClasseFunzione(){
}
public boolean metodoClasseFunzione(){
boolean fatto = true;
System.out.println("faccio cose,vedo persone");
return fatto;
}
}
...ciao Andrea...
si..il tuo esempio non fa una piega ed è quello che sto tentando di fare...adesso ho fatto loggare cosa succede,
nella classe principlale:
GeneraEventoNuovaVendita b = new GeneraEventoNuovaVendita(idVendita, jTable1.getValoreAt(i, 0).toString(), jTable1.getValoreAt(i, 2).toString(), jTable1.getValoreAt(i, 4).toString(), jTable1.getValoreAt(i, 3).toString());
Misc.logga("dopo Genera: " + new Boolean(b.getSuccesso()));
if (b.getSuccesso())
scaricato=true;
}
in GeneraEventoNuovaVendita:
public void processEvent(AWTEvent evt) {
if (evt instanceof EventoNuovaVendita)
try {
GestoreListeners.gestisciNuovaVendita(evt);
successo = true;
done = true;
Misc.logga("successo nel try: " + new Boolean(successo).toString());
} catch (AWTException ex) {
ex.printStackTrace();
successo = false;
done =true ;
Misc.logga("successo nel catch: " + new Boolean(successo).toString());
}
}
public boolean getSuccesso() {
Misc.logga("successo in getSuccesso(): " + new Boolean(successo).toString());
return successo;
}
quello che mi viene loggato per me è parecchio strano, ed è:
13.03.2009 16:55:12 -- successo in getSuccesso(): false
13.03.2009 16:55:12 -- dopo Genera: false
13.03.2009 16:55:12 -- successo in getSuccesso(): false
13.03.2009 16:55:15 -- successo nel try: true
banryu79
13-03-2009, 16:25
Prova un po' senza dichiare successo come static.
si ho provato pure quello ma non cambia nulla..sembra che l'esecuzione del programma vada oltre la GeneraEventoNuovaVendita se aspettarne la completa esecuzione...........
^TiGeRShArK^
13-03-2009, 17:10
si ho provato pure quello ma non cambia nulla..sembra che l'esecuzione del programma vada oltre la GeneraEventoNuovaVendita se aspettarne la completa esecuzione...........
dipende da quando viene chiamato dall'esecutore il metodo processEvent immagino....
banryu79
13-03-2009, 17:21
Uhm, può essere che il tuo evento venga processato all'istante proprio perchè va a finire nella AWT Event Queue che magari in quel momento è vuota o quasi e AWT Event Thread in esecuzione ne esegue immediatamente il dispatch (chiama il tuo metodo che è l'override di processEvent della classe Component)
Però la tua classe/oggetto evento dovrebbe comunque avere il booleano interno già bello e inizializzato solo che a quel punto hai sia il tuo thread in esecuzione in accesso all'oggetto che l'AWT Event Thread che vuole modificarne lo stato.
Non so bene se lo scenario è questo...
In ogni caso io invece di estendere la classe Component per fare l'override di processEvent e inserire l'oggetto-evento con postEvent avrei optato per un altro approccio:
dal mio thread di esecuzione avrei codificato l'evento "NuovaVendita" nell'l'impementazione del metodo run di un Runnable (un altro thread) che avrei accodato nella AWT Event Queue mediante il metodo invokeLater (nel solito modo insomma).
In ogni caso io invece di estendere la classe Component per fare l'override di processEvent e inserire l'oggetto-evento con postEvent avrei optato per un altro approccio:
dal mio thread di esecuzione avrei codificato l'evento "NuovaVendita" nell'l'impementazione del metodo run di un Runnable (un altro thread) che avrei accodato nella AWT Event Queue mediante il metodo invokeLater (nel solito modo insomma).
mi sa che devo leggermi un pò di documentazione allora, prima di andare avanti con la discussione :Prrr:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.