Newsgroup: it.comp.java
Titolo: Intercettare chiusura JFrame

Salve a tutti, premetto che mi sto avvicinando a Java da non molto.
Come posso intercettare la chiusura di una jframe, in maniera tale da
non farla riaprire se è già aperta?
Strutturalmente la parte del mio programma interessata è composto da
due file, il primo che istanzia l'apertura del jframe presente nel
secondo file che provvede alla creazione della struttura della
finestra. Per entrare nel dettaglio vi mostro il punto a ci sono
arrivato e cui non riesco a risolvere:
Nel primo file Gippo.java ho:
GUIConfig finestraConfig = null;
....
if (finestraConfig == null) finestraConfig = new GUIConfig();
Mentre nel secondo file GUIConfig.java, sono giunto a questo:
addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e) {
                System.out.println(""+getDefaultCloseOperation());
            }
        });
Il println per rendermi conto quale valore mi viene restituito. Ma non
mi può ritornare alcun valore poichè windowClosing è void..
Ringrazio anticipatamente a chi mi aiuta.

Ciao, Gianni!
Il giorno 15/07/2004 alle ore 16:34 hai scritto:
 GM> Come posso intercettare la chiusura di una jframe, in maniera tale da
 GM> non farla riaprire se è già aperta?
Usa un metodo statico per la creazione dell'oggetto associato ad una
variabile, sempre statica, che ne memorizza lo stato. Es:
class TuaFinestra extends JFrame implements WindowListener
{
static JFrame miaFinestra = null;
...
static JFrame creaFinestra() {
  if (miaFinestra == null) {
    miaFinestra = new TuaFinestra();
    miaFinestra.addWindowListener(this);
  }
  return miaFinestra;
}
...
// Naturalmente dovrai gestire l'evento di chiusura
public void windowClosed(WindowEvent e)
{
  miaFinestra = null;
}
}
Poi potresti anche dichiarare protected il costruttore, cosi' non potrai
usarlo in altre classi per sbaglio.
S. E. & O.
Bye
-- 
Fear is the path to the Dark Side.
http://www.maccasoft.com

Marco Maccaferri ha scritto:

esiste anche il metodo setDefaultCloseOperation(int op)
vedi se può fare al caso tuo,
altrimenti usa il windowListener o il windowAdapter e ridefinisci il 
metodo windowClosed(windowEvent ev)

Grazie ragazzi, avrò spiegato male il mio problema, comunque ho:
- un file A.java nel quale è presente l'instanza alla finestra creata
dal file B.java, nel segunete modo
static B finestraConfig = null;
..
if (finestraConfig == null) finestraConfig = new B();
- nel file B.java viene creata la truttura della finestra e in essa è
presente anche
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
Problema:
Se io avvio A.java e clicco sul mio JMenuItem si deve aprire la
finestra B.java, se e solo se non è già aperta.
Io sono arrivato al punto che la finestra si apre una sola volta
(ossia la prima volta), perchè non riesco a intercettare quando B.java
viene chiuso, come posso fare?

Ciao, Gianni!
Il giorno 16/07/2004 alle ore 10:15 hai scritto:
 GM> Io sono arrivato al punto che la finestra si apre una sola volta
 GM> (ossia la prima volta), perchè non riesco a intercettare quando B.java
 GM> viene chiuso, come posso fare?
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
E poi implementi WindowListener come ti e' stato detto.
Bye
-- 
Try not. Do, or do not. There is no try.
http://www.maccasoft.com

 Bye
Ciao Marco, ma come faccio se la chiusura del jframe č nel file
B.java, mentre la chiamata di apertura del jframe č nel file A.java
(quindi istanziato in questo)? Non so se ho reso l'idea.
L'implementazione del WindowListener in B.java richiede che io
richiami il JFrame definito nel file B.java e non in A.java, cosě come
č ora.
Grazie Gianni

Ciao, Gianni!
Il giorno 16/07/2004 alle ore 16:38 hai scritto:
 GM> Ciao Marco, ma come faccio se la chiusura del jframe č nel file
 GM> B.java, mentre la chiamata di apertura del jframe č nel file A.java
 GM> (quindi istanziato in questo)?
Ma hai letto quello che ti e' stato scritto o hai guardato solo le figure ?
Se in A.java hai una riga con 'B w = new B()' basta semplicemente che la
sostituisci con 'B w = B.creaFinestra()' (come ti ho suggerito prima),
creaFinestra creera' una nuova finestra solo se non e' gia' aperta,
altrimenti ritornera' l'istanza precedente. Non mi sembra una gran
complicazione.
 GM> Non so se ho reso l'idea. L'implementazione del WindowListener in
 GM> B.java richiede che io richiami il JFrame definito nel file B.java e
 GM> non in A.java, cosě come č ora.
Se il JFrame e' definito in A.java, quello che ti e' stato detto lo metti in
A.java, se e' definito in B.java lo metti in B.java, non mi sembra tanto
difficile.


...

Grazie Luca e Marco, non per giustificarmi ma io avevo detto in
anticipo che mi sto avvicinando a Java da non molto tempo..
Comunque ho risolto grazie ai vostri consigli.. a buon rendere ;)

tranquillo ^_^