|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
|
[JAVA] Eventi finestre
Ciao Ragazzi,
ho bisogno di un consiglio sulle GUI che non so proprio come risolvere un problema. Ho un Frame principale della mia applicazione.. Esso ha dei pannelli con dei bottoni. Ho collegato ad un bottone un evento secondo cui deve aprire un nuovo JFrame che consiste in un form di insermento. Il problema è che la finestra principale (sottostante) rimane attiva, dandomi quindi la possibilità di di premere di nuovo quel bottone ed aprire un nuovo JFrame associato. Volendo evitare questo, avrei intenzione di disabilitare il form principale, in modo da non poter più aprire form secondari. Il problema è che non so come riabilitare il form principale alla chiusura della maschera appena aperta. Grazie per i consigli |
![]() |
![]() |
![]() |
#2 |
Member
Iscritto dal: Apr 2005
Messaggi: 224
|
Fai implementare alla classe del frame principale l'intefaccia windowlsitener (o estendi la classe windowadapter), registri tale classe come ascoltatore degli eventi di finestra del frame secodario e nel metodo windowClosing che dovrai implementare (nella classe del frame principale) fai in modo che il frame si "riabiliti".
Più comodo secondo me è invece che aprire e chiudere il jframe secondario , renderlo "visibile" (setVisible(true)) alla pressione del bottone sul frame principale così ad una successiva pressione del bottone non si aprirà una nuova finestra ma verrà invocato di nuovo il setVisisble(true) , poi col bottone del frame secondario prendi i dati del form e rendi invisibile il frame. ciao |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: May 2003
Messaggi: 119
|
non so come risolvere il tuo problema, forse basta catturare l'evento onWindowClosing (o un nome simile) del secondo JFrame.
Cmq quando ho un bottone in un JFrame principale che deve aprire un altro JFrame secondario di solito io creo il frame secondario nel costruttore del frame principale senza poi mostrarlo a video. Poi all'evento del click del bottone eseguo il metodo show del JFrame secondario, così anche se il bottone viene premuto 1000 volte di JFrame secondari se ne vede 1 solo. |
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: May 2003
Messaggi: 119
|
azz, Alvaro Vitali mi ha anticipato di poki secondi!
Ed è stato pure più esauriente, devo migliorarmi x il futuro |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
|
Grazie Alvaroo!!!
provo subito! ti faccio sapere!! grazie ragazzi... |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
|
Dunque, ho fatto come hai detto tu Alvaro.. optando per la seconda scelta. E' molto più comodo caricare tutti i vari frames all'avvio del programma principale e renderli visibili a tempo opportuno.
Ora dovrei chiudere il frame in questione collegando l'evento di chiusura ad un bottone. Come devo fare? |
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: May 2003
Messaggi: 119
|
Allo stesso modo per chiudere i frame basta solo che li rendi non visibili, quindi basta usare il metodo hide() (oppure setVisible(false)) invece di show() (o setVisible(true))
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
|
OK grazie, tanto a questo punto, visto che creo i nuovi oggetti Jframe nella classe principale, posso controllarli da lì...
|
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
|
Quote:
riepilogando: la mia GUI principale, crea un frame, lo visualizza su pressione di un tasto. Questo frame ha un tasto "Annulla". Tale tasto quando premuto deve rendere nascosto il frame. Non so come fare purtroppo... Questo perchè non trovo un metodo che lo faccia. Ditemi se devo estendere ulteriori classi oltre a JFrame. |
|
![]() |
![]() |
![]() |
#10 |
Member
Iscritto dal: May 2003
Messaggi: 119
|
Quando crei l'event listener per il bottone annulla non usare il costruttore di default ma fanne uno che prenda come parametro il tuo frame, una cosa simile
Codice:
nel JFrame AnnullaListener a=new AnnullaListener (this); annullaButton.addActionListener(a); //dove annullaButton è il nome del bottone "Annulla" ... fouri dal JFrame class AnnullaListener implements ActionListener{ frameSecondario fs; //dove frameSecondario è il nome della classe che rappresenta il tuo frame AnnullaListener (frameSecondario f){ fs=f } metodo chiamato quando premi il tasto annulla di cui non ricordo il nome () { fs.hide(); } } Ultima modifica di Molz : 20-07-2005 alle 12:28. |
![]() |
![]() |
![]() |
#11 |
Member
Iscritto dal: Apr 2005
Messaggi: 224
|
Ma scusa quando crei il JButton Annulla imposterai una scoltatore per l'evento di pressione:
JButton annulla = JBUtton("annulla"); annulla.addActionListener(oggetto-che-ascolta); l' oggetto-che-ascolta implementerà ActionListener ed avrà un metodo ActionPerfomed(ActionEvent e) in cui puoi chiamare il setVisible(false) se l'oggetto che ha invocato l'evento è annulla. oggetto-che-ascolta potrebbe essere il tuo frame principale...oppure lo stesso frame secondario, in tal caso annulla.addActionListener(oggetto-che-ascolta); diventerà annulla.addActionListener(this); ed il frame secondario dovrà implementare ActionListener ed il metodo ActionPerformed come sopra... ![]() Secondo caso: class frameSecondario extends JFrame implements ActionListener { private JButton annulla = JBUtton("annulla"); public frameSecondario() { super(); // bla bla bla annulla.addActionListener(this); // aggiungi il bottone al layout } public void ActionPerfomed(ActionEvent e) { Object source = e.getSource(); if (source==annulla) this.setVisible(false); } } Mi sto incastrando con le risposte di Molz ma credo che stiamo dicendo le stesse cose... ![]() Ultima modifica di Alvaro Vitali : 20-07-2005 alle 12:36. |
![]() |
![]() |
![]() |
#12 | |
Member
Iscritto dal: May 2003
Messaggi: 119
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
|
Scusami.. purtroppo ci vuole un po' di pazienza con queste cose.. resta difficile anche a me spiegare bene il problema.. Intanto ti dico che sto usando Eclipse per realizzare la gui. Non so se hai in mente com'è lo stile di programmazione di Eclipse, ma posso dirti che ci sono tanti metodi getNomeComponente()
per inizializzializzarli; Codice:
per esempio getAnnullaButton(){ ... creazione oggetto ... impostazioni varie annullaButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event ActionEvent e) { this.hide(); // o qualcosa del genere, intendendo this come il frame } }); } Non posso nemmeno mettermi a cambiare troppo la struttura del mio programma perchè ho la consegna di un progetto molto presto e mi devo pure sbrigare.. porca miseria!!! Grazie amico... grazie x la disponibilità |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
|
ah, ecco, nel frattempo che scrivevo stavate rispondendo...
ho letto quello che dice Alvaro Vitali... dunque, se dovessi fare come ha detto lui, come lo adatto a quello stralcio di codice che ho postato? |
![]() |
![]() |
![]() |
#15 |
Member
Iscritto dal: Apr 2005
Messaggi: 224
|
Anche io uso eclipse ma la Gui cmq la faccio a mano proprio perchè non mi piace come organizza le cose, cerca di replicare questo che ti scrivo, in questo modo deleghi al frame secondario il compito di ascoltare la pressione del tasto e rendersi invisibile (mi pare che solo questo non riuscivi a fare):
Codice:
class frameSecondario extends JFrame implements ActionListener { private JButton annulla = JBUtton("annulla"); public frameSecondario() { super(); // bla bla bla annulla.addActionListener(this); // aggiungi il bottone al layout } public void ActionPerfomed(ActionEvent e) { Object source = e.getSource(); if (source==annulla) this.setVisible(false); } } |
![]() |
![]() |
![]() |
#16 |
Member
Iscritto dal: May 2003
Messaggi: 119
|
Come ti ho detto io farei così
Codice:
per esempio getAnnullaButton(){ ... creazione oggetto ... impostazioni varie annullaButton.addActionListener(new MioListener(this)); } ..... } //chiusura della parentesi graffa della classe principale (il tuo JFrame) class MioListener implements java.awt.event.ActionListener() { nomeDelleClasseCheRappresentaIlJFrame a; MioListener (nomeDelleClasseCheRappresentaIlJFrame a2){ a=a2; } public void actionPerformed(java.awt.event ActionEvent e) { a.hide(); } } Stranamente Alvaro mi ha anticipato, i nostri metodi sono diversi, ma vanno beneone entrambi. Ultima modifica di Molz : 20-07-2005 alle 12:49. |
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
|
OK grazie!!! finalmente sono riuscito a fare questa cosa.. anche se con fatica ma l'importante è che ora ci sia riuscito.
Adesso però, oltre a questo bottone c'è anche un bottone OK, che dopo aver fatto determinate operazioni definite in un actionPerformed, anch'esso deve nascondere il frame... Il codice di uno dei bottoni annulla che ho scritto è: Codice:
// Bottone Annulla (OK - va bene) private JButton getCancelButtonAdd() { if (cancelButtonAdd == null) { cancelButtonAdd = new JButton(); cancelButtonAdd.setBounds(338, 147, 94, 25); cancelButtonAdd.setText("Annulla"); cancelButtonAdd.addActionListener(new CloseListener(this)); } return cancelButtonAdd; } //************************************* // Classe ulteriore per chiudere il frame... OK - Va bene... class CloseListener implements java.awt.event.ActionListener{ FrmInserisci f; public CloseListener(FrmInserisci frm){ f = frm; } public void actionPerformed(java.awt.event.ActionEvent e){ f.hide(); } } //************************************* //Metodo di un bottone OK: private JButton getOkButtonAdd() { if (okButtonAdd == null) { okButtonAdd = new JButton(); okButtonAdd.setBounds(243, 146, 87, 26); okButtonAdd.setText("OK"); okButtonAdd.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { // deve effettuare delle operazioni e poi chiudere!!!! come il tasto annulla } }); } return okButtonAdd; } |
![]() |
![]() |
![]() |
#18 |
Member
Iscritto dal: May 2003
Messaggi: 119
|
basta che associ al bottone OK lo stesso listener che al bottone Annulla
okButtonAdd.addActionListener(new CloseLintener(this)) e poi come diceva alvaro vitali è sufficiente che nella funzione actionPerformed(ActionEvent e) tu invochi il metodo getSource sull'evento Object source = e.getSource(); e poi esegui il controllo if(source==okButtonAdd ){ esegui le tue operazioni } //e poi in ogni caso f.hide(); Altrimenti puoi creare un listener diverso per ogni bottone che crei e in tal caso sarebbe okButtonAdd.addActionListener(new OKCloseLintener(this)) e poi la stessa procedura di prima per il bottone Annulla Ultima modifica di Molz : 20-07-2005 alle 13:27. |
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
|
OK! c'è solo un piccoliiiiiiissimo problema:
if(source==okButtonAdd ) non posso farlo perchè non mi vede quella variabile.... anche se ritengo sia una cosa assurda |
![]() |
![]() |
![]() |
#20 |
Member
Iscritto dal: Apr 2005
Messaggi: 224
|
Che visibilità ha quel bottone?
In alternativa puoi impostare okButtonAdd.setActionCommand("ok"); e poi sostituire String command = e.getActionCommand(); if (command.equals("ok")) { } al posto di if(source==okButtonAdd ) |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:07.