View Full Version : Un aiuto per un programmino in java
tognesimo
14-10-2003, 13:23
Ho realizzato con l'aiuto di un utente del forum un programmino in java che dovevo comsegnare ad un prof. per l'università.LA questione è questa:nel programmino è presente la classe Simone che ha al suo interno il main.Io ho creato dei metodi(6 per la precisione) ovvero ricerca libro,ricerca cd,cancella libro,cancella cd,inserisci libro inserisci cd ma non sono dentro al main.Come si fa a metterli nel main?Il prof mi ha detto che gli actionlistener devo metterli dentro al main
Allego anche il programmino!!
tognesimo
14-10-2003, 14:56
Nessuno che aiuta un povero studente che ne sa poco sul java??
Forza raga datemi una mano!!!!
E' un programma così bellino, con un codice così pulito e ben fatto, perchè cavolo vuole farti infilare gli ActionListener nel main?
Bisognerebbe chiedergli se vuole tutto il codice dell'actionlistener nel main oppure solo la dichiarazione ed inizializzazione delle classi che implementano ActionListener nel main, oppure un solo ActionListener per tutti gli eventi dichiarato o costruito nel main.
Alla peggio (ammucchiata nel main) sarai costretto ad usare delle istanze delle interfacce ActionListener create nel main, tipo:
public static void main(String[] args) {
ActionListener listener1=new ActionListener() {
public void actionPerformed(ActionEvent a) {
//gestione eventi
}
};
//e poi le passi ad un costruttore di MenuFrame
MenuFrame frame=new MenuFrame(listener1)
}
Ma sinceramente così si aprono un migliardone di problemi, mi sembra veramente insostenibile...sei sicuro sicuro che abbia detto che vuole tutti gli ActionListener nel main?
tognesimo
15-10-2003, 12:32
Ti faccio sapere,gli ho mandato una mail,vediamo cosa mi risponde.Lui mi ha detto di implementare gli action listener nel main e non di richiamarli esternamente.Puoi darmi una mano?
Una mano la do volentieri, pur restando fermamente convinto dell'inutilità di quello che ti è stato chiesto di fare.
Il problema è che "implementare nel main" non è proprio una linea guida così definita: ad esempio, potresti creare nel main i tuoi oggetti ActionListener e nei rispettivi metodi "actionPerformed" rinviare a metodi esterni, tipo:
p s v main(...) {
ActionListener listener1=new ActionListener() {
public void actionPerformed(ActionEvent a) {
doSome();
}
}
}
p s v doSome() {...}
Si coglie l'assurdità: perchè dichiarare un ActionListener nel main se poi posso fargli usare dei metodi esterni al main?
D'altro canto, dovendo usare direttamente il metodo actionPerformed per gestire la funzione, per questioni legate alla jvm gli oggetti a cui può accedere il corpo di una classe "astratta" (però non metterei la mano sul fuoco sul fatto che questo sia il termine esatto per definire il nostro listener "interno") devono essere costanti (final). Si può fare, per carità, ma il senso mi sfugge. Cmq, quando hai la risposta del professore fatti sentire e vediamo.
&Ciao.
tognesimo
16-10-2003, 13:30
Allora,ho appena parlato col prof:
lui vuole che i metodi "inserisci libro,inserisci cd" siano metodi della classe simone e gli action listener siano contenuti li dentro.In pratica lui mi ha detto che gli actionlistener devono essere interni alla classe simone e non esterni.listen e listenl sono metodi relativi alla cancellazione dei libri e dei cd(questi action listener devo essere dentro simone.
Inoltre mi ha detto di mettere cd e libro come esterne(penso siano gia classi esterne giusto?)!!
La cosa allora ha un senso, diciamo che lui vuole un certo modello di organizzazione delle classi, diverso da quello che hai adottato e per certi versi più comune.
Libro e CD sono due oggetti e li crei a partire da un modello di classe (e qui le due classi Libro e CD sono perfette).
Poichè CD e Libro sono già classi esterne, pur essendo definite nello stesso file sorgente, credo che il tuo prof. voglia che tu crei anche due file sorgente (CD.java e Libro.java). E' sufficiente un copia e incolla. (sempre che tu non abbia già i file "separati").
Listen e ListenLibri le elimini e "travasi" il loro contenuto in un unico actionPerformed.
Quale?
Anche qui devo interpretare i voleri dell'onnipotente: secondo me adotti una "tecnica" consigliabile, quella di tenere separata la classe che contiene il main dal resto del codice sorgente.
Tuttavia, dovendo comunque usare Simone per un'ActionListener ti conviene far diventare Simone la finestra dell'applicazione (spostando in pratica il contenuto di MenuFrame in Simone), fargli implementare appunto ActionListener e raggruppare tutti gli eventi nel suo actionPerformed.
Nella classe MenuFrame hai usato delle istanze astratte di ActionListener per alcuni bottoni (es. searchButtonBook.addActionListener(new ActionListener()...).
Adesso devi delegare il compito di quelle classi ad un metodo della classe Simone e poi richiamarlo nel suo actionListener in associazione all'evento proveniente dal componente searchButton.
Non è sbagliato l'uso di classi astratte, ma ha un suo scopo, che è quello di ridurre al minimo il ritardo di risposta agli eventi che si ha quando ci si trova di fronte a sfilze di pulsanti e si deve verificare nell'acitonPerformed chi abbia lanciato l'evento AWT. Nel nostro caso, mi sembra che Egli voglia un unico ActionListener, tu esegui :).
In estream sintesi, la struttura del tuo programma credo debba seguire questo schema:
1 file CD.java -> sorgente della classe CD
1 file Libro.java -> sorgente della classe Libro
1 file Simone.java -> la parte "grafica" dell'applicaizone + il main:
class Simone extends JFrame implements ActionListener {
Button cdButton=null;
p s v main(...) {
new Simone();
}
Simone() {
...costruzione della GUI
show();
}
actionPerformed(evento) {
if(evento.source==cdButton) {
metodoAssociatoAcdButton();
}
}
metodoAssociatoAcdButton() {
faiqualcosa...
}
}
Si può capire come l'intero codice debba essere ampiamente rimaneggiato, tuttavia, poichè le routine che hai già sono perfettamente funzionanti, alla fine è più un lavoro di spostamento da qui a là e da li a qui.
tognesimo
17-10-2003, 12:31
Hai Pvt PGI
In allegato c'è lo stesso programma "spezzato" in tre classi (che tra l'altro già c'erano) CD, Libro e Simone.
Di "Simone.java" è cambiata solo l'organizzazione delle funzioni (c'è un unico actionListener adesso) che matengono invariato il contenuto.
Credo che il codice possa essere ridotto anche parecchio però non so quale sia il livello di conoscenza presunto dal tuo professore. Se il corso è stato di ben 8 ore direi che quello che hai fatto ha già dello straordinario.
&Ciao.
tognesimo
17-10-2003, 19:41
Grazie Pgi,se voglio cambiare il nome della classe "Simone" in "Archivio" come faccio?Ti ringrazio per il tuo aiuto mi 6 stato davvero prezioso!
nel file Simone.java cambi il nome della classe da Simone ad Archivio, salvi (sempre come Simone.java) poi rinomini il file in Archivio.java e ricompili.
oppure cambi il nome della classe da Simone ad Archivio (sempre nel sorgente) poi salvi come Arichivio.java e ricompili.
&Ciao
tognesimo
20-10-2003, 13:51
grazie PGI ho risolto!!Una piccola cosa:Quando ha creato l'action performed come hai fatto ad ottenere un puntatore all'oggetto che ha generato l'evento?
C'è una versione breve (quella che ti propino) ed una più lunga.
La breve:
actionPerformed(ActionEvent a) {...}
gli ActionEvent hanno un metodo "Object getSource()" che restituisce un "riferimento" all'oggetto che ha generato l'evento.
Cosa sia realmente quel "oggetto sorgente" dipende da come è fatto l'ActionEvent, per i componenti che trovi nelle librerie swing, awt et similia è il componente su cui hai agito ma nulla vieta la creazione di eventi che abbiano impostato come sorgente un oggetto totalmente diverso.
&Ciao.
PS, fammi sapere (se vuoi) com'è andata col prof, che sono curioso :)
E soprattutto quando ti da il voto dagli il libretto di PGI. :mad:
Dai non dire così :eek:
Ho solo separato in 3 parti un file di testo, tutte le routine e tutta la parte grafica sono assolutamente farina del suo sacco (o almeno del sacco che è arrivato a me :) ), se non fosse stato per il poco tempo a disposizione l'avrebbe fatto da solo e forse anche meglio.
:)
&Ciao.
tognesimo
22-10-2003, 13:25
Originariamente inviato da cn73
E soprattutto quando ti da il voto dagli il libretto di PGI. :mad:
Se fossi stato tu nella mia situazione voglio vedere cosa avresti fatto.Ho fatto solo 8 ore di java con un prof. che era al primo anno di insegnamento(e quindi puoi immaginare che razza di esperienza avesse).E poi a ingegneria pretendono cose al limite dell'immaginabile.Io voglio imparare il Java ma il tempo che ci danno loro è praticamente niente.Sicuramente sarei arrivato ad una conclusione ma avrebbe richiesto certamente molto + tempo di quello che mi ha dato quel figlio di p****a.Cercate di capirmi!!
Perchè credi che non mi cia trovato nella tua situazione?? A scuola, all'università e e al lavoro? E te lo ripeto, come ti scrissi nell'altro tuo post, non ci sarà sempre qualcuno ad aiutarti, anzi a "sostituirti".
Io cerco di capirti, e ti avrei aiutato per primo se non mi fossi accorto che non avevi volontà di ricercare e applicarti ma solo di avere la pappa pronta. Almeno questa è stata la mia impressione nell'altro tuo post, questo non l'ho manco letto.
Scusa la durezza.
Se c'è qualcuno che vuol fare ammenda, avrei qui un 4000 linee di codice Java da ottimizzare, così, tanto per divertirsi... :D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.