PDA

View Full Version : [Java] Evento a chiusura applicazione


divincodin
09-06-2009, 15:53
Ciao,come faccio a fare in modo che una volta che l'utente chiude la finestra,scriva i dati temporanei in file txt?
Mi spiego meglio...come scrivere su file lo so,ma non riesco a fare in modo che appena l'utente chiude la finestra tramite la "x" rossa,i dati vengono salvati.
Per la finestra ho impostato:


setDefaultCloseOperation(EXIT_ON_CLOSE);


Ecco...non appena avviene ciò,devo eseguire questa parte di codice:


File f=new File(FileDiTestodir);
FileOutputStream fos=new FileOutputStream(f);
PrintStream ps=new PrintStream(fos);
for (int l=0;l<righe.size();l++)
ps.println(righe.get(l));


Grazie in anticipo per una eventuale risposta...ciao

banryu79
09-06-2009, 16:09
Bene, devi solo dotare il componente che rappresenta la tua finestra da chiudere di un WindowListener, e inserire il codice che deve essere eseguito subito prima della chiusura della finestra nel corpo del metodo windowClosing, da implementare.

Se scegli di implementare un WindowListener, che è un'interfaccia, allora devi implementare anche tutti gli altri metodi (puoi semplicemente lasciare i loro corpi vuoti), altrimenti puoi usare WindowAdapter, che è una classe che già implementa l'interfaccia WindowsListener, e tu devi solo fare l'override del metodo windowClosing.

Qui i javadoc di WindowListener (http://java.sun.com/javase/6/docs/api/java/awt/event/WindowListener.html)

divincodin
11-06-2009, 09:38
Perchè appena inserisco "implementes WindowListener" mi da errore?

L'intestazione della classe è la seguente:

class Frame extends JFrame implements ActionListener,ListSelectionListener,WindowListener


L'errore che mi da è questo:


Applicazione.java:34: Frame should be declared abstract; it does not define windowClosing(java.awt.event.WindowEvent) in Frame
class Frame extends JFrame implements ActionListener,ListSelectionListener,WindowListener
^
1 error

banryu79
11-06-2009, 09:43
Perchè appena inserisco "implementes WindowListener" mi da errore?

L'intestazione della classe è la seguente:

class Frame extends JFrame implements ActionListener,ListSelectionListener,WindowListener


L'errore che mi da è questo:


Applicazione.java:34: Frame should be declared abstract; it does not define windowClosing(java.awt.event.WindowEvent) in Frame
class Frame extends JFrame implements ActionListener,ListSelectionListener,WindowListener
^
1 error

Perchè se dichiari una classe che implements un'interfaccia, a meno che non dichiari la classe abstract, la classe deve implementare tutti i metodi dichiarati nell'interfaccia.
Se chiedi a javac di compilare e non hai ancora implementato i metodi, javac giustamente ti segnala un errore e non compila.

divincodin
11-06-2009, 09:56
Ho fatto come mi avevi detto nella prima risposta,ho implementato tutti gli altri metodi WindowListener lasciando i loro corpi vuoti....ma l'errore che da è questo.
In sostanza l'intestazione è quella che ho scritto prima e dentro la classe,dopo l'actionperformed ho inserito:



public void windowClosed(WindowEvent event)
{
//aggiornaTxt(righe);
File f=new File(FileDiTestodir);
FileOutputStream fos=new FileOutputStream(f);
PrintStream ps=new PrintStream(fos);
for (int l=0;l<righe.size();l++)
ps.println(righe.get(l));


}

public void windowActivated(WindowEvent event) { }
public void windowDeactivated(WindowEvent event) {}
public void windowDeiconified(WindowEvent event) {}
public void windowIconified(WindowEvent event) { }
public void windowOpened (WindowEvent event) { }

banryu79
11-06-2009, 10:00
Come ti ha anche detto javac: manca l'implementazione di windowClosing; tu hai implementato tutti i metodi dichiarati in WindowListener, tranne quello.

Che, tra l'altro, per quello che vuoi fare tu, da come l'hai descritto nel primo post, è proprio il metodo che ti serve, non windowClosed().

banryu79
11-06-2009, 10:02
A, un'altra cosa: penso sia meglio wrappare le operazioni di scrittura file che fai dentro un Thread/Runnable e lanciarlo, da dentro windowsClosing, in modo da non appesantire il lavoro dell'EDT.

divincodin
11-06-2009, 12:05
Siccome il file va aggiornato non soltanto quando l'utente chiude la finestra,ma anche in un altro caso...al posto di scrivere 2 volte il codice di scrittura,ho creato un metodo interno alla classe "SalvaTxt()". Lo richiamo sia nel 2° caso...e x la chiusura della finestra ho usato una classe anonima annidata,all'interno del costruttore:


class Frame extends JFrame implements ActionListener,ListSelectionListener
{
pannelloa a=new pannelloa();
JMenuItem apriCartella,apriVideo;
File f;
String pathfile,nameF;
JList ListaIcone;
JPanel PannelloAnte,PannelloComme,ModificaSalva;
JLabel Label_1;
JTextArea TextArea;
String FileDiTestodir;
ArrayList righe; //conterrà le righe del file txt corrente
JButton modifica,salva;
String corrente;
int indexcorrente;

public Frame()
{
setTitle("Analizzatore Video Medicali");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setExtendedState(MAXIMIZED_BOTH);

addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e)
{
SalvaTxt();
}
});


JMenuBar barra=new JMenuBar();
JMenu menu=new JMenu("File");
apriVideo=new JMenuItem("Apri Video");
apriCartella=new JMenuItem("Apri Cartella Immagini");
barra.add(menu);
menu.add(apriVideo);
menu.add(apriCartella);
apriVideo.addActionListener(this);
apriCartella.addActionListener(this);
this.setJMenuBar(barra);
...
...
} //chiusura costruttore


E questo è il metodo interno alla classe che richiamo:


public void SalvaTxt()
{
try
{
//aggiornaTxt(righe);
File f=new File(FileDiTestodir);
FileOutputStream fos=new FileOutputStream(f);
PrintStream ps=new PrintStream(fos);
for (int l=0;l<righe.size();l++)
ps.println(righe.get(l));
fos.close();
}

catch(Exception e3){}

}


Che te ne sembra di questa mia soluzione?
Cmq ti ringrazio ancora una volta per l'aiuto...sei un mito :D

banryu79
11-06-2009, 12:10
Che te ne sembra di questa mia soluzione?

Bravo, hai usato bene l'Adapter come classe anonima annidata.


Cmq ti ringrazio ancora una volta per l'aiuto...sei un mito :D

Eh, magari fossi un mito, forse così riuscirei a finire l'inghippo di applicazione in cui sono invischiato al momento :D
Comunque prego.