PDA

View Full Version : [Java] Passare il controllo da un Frame caricato da main a un Frame caricato da file


Simone89RN
23-07-2009, 11:05
Ciao a tutti. Vi illustro il mio problema:

package ascoltatori;

import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import javax.swing.filechooser.*;
import campoMinato.MyFrame;

public class MyLoadGameListener implements ActionListener {

JFileChooser chooser;
FileNameExtensionFilter filter;
MyFrame mainFrame, newFrame;

public MyLoadGameListener(MyFrame parent) {
mainFrame = parent;
chooser = new JFileChooser();
filter = new FileNameExtensionFilter("CMP Files", "cmp");
chooser.setFileFilter(filter);
}

public void actionPerformed(ActionEvent e) {
JMenuItem loadGame = (JMenuItem) e.getSource();
int returnVal = chooser.showOpenDialog(loadGame);
if (returnVal == JFileChooser.APPROVE_OPTION) {
FileInputStream f = null;
ObjectInputStream is = null;
try {
f = new FileInputStream(chooser.getSelectedFile().getPath());
is = new ObjectInputStream(f);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e2) {
e2.printStackTrace();
}
try {
newFrame = (MyFrame) is.readObject();
newFrame.setVisible(true);
mainFrame.setVisible(false);
is.close();
} catch (IOException e1) {
e1.printStackTrace();
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
}
}
}

}

I Frame in questione sono newFrame e mainFrame che rappresentano rispettivamente il frame caricato da file e quello gia in esecuzione. Entrambi hanno la stessa struttura, una JMenuBar formata da 3 JMenuItem e un JPanel contenente una matrice di bottoni. All'evento click del pulsante sinistro del mouse ognuno di questi componenti genera una classe ascoltatrice che per quanto riguarda i JMenuItem funziona da:

1) Creare un nuovo oggetto MyFrame al posto di quello corrente.
2) Salvare il MyFrame corrente su file.
3) Caricare un MyFrame da file.

Il codice postato rappresenta la classe ascoltatrice predisposta per il caricamento da file di un MyFrame precedentemente salvato. Il Frame viene caricato correttamente in memoria, ma non ascolta più gli eventi legati ai bottoni della matrice e a 2 delle JMenuItem, quella di salvataggio e quella di caricamento, come mai? Chi mi sa aiutare?

PGI-Bis
23-07-2009, 13:55
Gli ascoltatori di evento non vengono serializzati. Devi personalizzare la serializzazione per salvarli e caricarli.

Simone89RN
23-07-2009, 15:13
Gli ascoltatori di evento non vengono serializzati. Devi personalizzare la serializzazione per salvarli e caricarli.

Ok li ho serializzati implementandone l'interfaccia, ma non viene effettuato il writeobject() durante il salvataggio perchè non è serializzabile la classe javax.swing.filechooser.FileNameExtensionFilter e per lo stesso motivo in fase di caricamento con il readobject().

Che posso fare?

PGI-Bis
23-07-2009, 15:21
Se vuoi serializzare una classe che non è serializzabile devi dichiarare un'estensione di quella classe, renderla esternalizzabile (implements Externalizable) e gestire "manualmente" la lettura e scrittura dei dati che ti interessano nel flusso seriale.

Per i JavaBean - tutti i componenti Swing sono dei JavaBean - esiste un diverso meccanismo di persistenza, documentato nel package java.beans.

banryu79
23-07-2009, 15:36
* snip

Simone89RN
23-07-2009, 17:06
Se vuoi serializzare una classe che non è serializzabile devi dichiarare un'estensione di quella classe, renderla esternalizzabile (implements Externalizable) e gestire "manualmente" la lettura e scrittura dei dati che ti interessano nel flusso seriale.

Per i JavaBean - tutti i componenti Swing sono dei JavaBean - esiste un diverso meccanismo di persistenza, documentato nel package java.beans.

Però c'è una cosa che non ho capito, nelle api la classe JFileChooser implementa l'interfaccia Serializable, quindi, se io non chiamassi nel codice un metodo di JFileChooser che usa come parametro un riferimento di classe non serializzabile, il debug non dovrebbe eseguire tranquillamente il writeobject() senza catturare l'eccezione?

Inoltre ho un'altra domanda, se la classe JFileChooser è serializabile, possibile che certi metodi utilizzano come parametri riferimenti di classi non serializzabili?

Se vedo nelle api oltre alla FileFilter c'è anche la FileSystemView che non implementa Serializable, purtroppo l'interfaccia Externalizable non la conosco e credo neanche di non poterla usare nel mio progetto.

A questo punto potrei rinunciare definitivamente a utilizzare una JFileChooser, però come mi comporto per dare nome e percorso del file che prima salverò su file System e poi caricherò?

banryu79
23-07-2009, 17:58
Inoltre ho un'altra domanda, se la classe JFileChooser è serializabile, possibile che certi metodi utilizzano come parametri riferimenti di classi non serializzabili?
Io non ci vedo nulla di strano.
I parametri passati ai metodi sono una cosa, invece i membri/campi della classe un'altra. Avesse avuto un campo non serializzabile allora avrei storto il naso anch'io...

Esaminando la gerarchia delle classi Swing/AWT, si evince che JFileChooser è Serializable, perchè, come tutti gli altri componenti visuali può vantare di discendere da java.awt.Component (che implementa Serializable).

Se vedo nelle api oltre alla FileFilter c'è anche la FileSystemView che non implementa Serializable, purtroppo l'interfaccia Externalizable non la conosco e credo neanche di non poterla usare nel mio progetto.
Link a risorsina (http://java.sun.com/developer/technicalArticles/Programming/serialization/) sulla serializzazione.

Simone89RN
24-07-2009, 15:15
Grazie, ho risolto lo stesso rinunciando alla classe FileNameExtensionFilter.

Ho un ultima domanda sul Javadoc, io uso Eclipse, e quando lo genero, tutto funziona come deve andare, eccetto un particolare, non ho i link ai metodi della classe Object e ai package di java, come faccio a inserirli?