Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    19

    Problema Salvataggio/Caricamento con JTabbedPane


    Salve a tutti =)

    ecco il mio problema:


    In breve è un fallimento del salvataggio/caricamento di un oggetto creato da me;
    Tuttavia il problema si presenta solamente se utilizzo le due funzioni (riportate qui sotto) che mi permettono di aggiungere e visualizzare le Tab al JTabbedPane che ho inserito nel mio pannello
    - nello specifico questo problema si presenta a partire dalle righe di comando da me evidenziate in rosso -


    Qui sotto posto parte della classe Lista e le sue funzioni “INCRIMINATE”
    (che vengono richiamate da un gestore bottoni opportunamente settato)


    codice:
    public class Lista implements Serializable
    
    {
    	private static final long serialVersionUID = 1L;
    	String nomeLista;
    	String path;
    	Vector<Categoria> categorie;
    	Vector<JComponent> catTab;
    
    	public Lista()
    	{
    		nomeLista=null;
    		path=null;
    		categorie=new Vector<Categoria>(0,1);
    		catTab=new Vector<JComponent>(0,1);
    	}
    <…....ho omesso le varie funzioni funzionanti XD lol.....>


    <...le 2 seguenti funzioni, se utilizzate impediscono il salvataggio corretto ...>
    (ho evidenziato in rosso il punto in cui nasce il problema)

    codice:
    
    public void aggiungiTab(JFrame f,JTabbedPane tp, String nomeTab)
    
    	{
    		JComponent jc = new PanelSfondo(new File("sfondo.jpg"));
    		jc.setName(nomeTab);
    		catTab.add(jc); 
    		tp.addTab(nomeTab,null,catTab.elementAt(catTab.size()-1),"Visualizza categoria"+nomeTab);
    
    //aggiungi i bottoni relativi alla categoria
    
    		JButton agg=new JButton("Aggiungi Elemento");
    		JButton del=new JButton("Rimuovi Elemento"); 
    		JButton rin=new JButton("Rinomina Elemento"); 
    		JButton delCat=new JButton("Elimina Categoria"); 
    		
    		jc.add(agg);
    		jc.add(del);
    		jc.add(rin);
    		jc.add(delCat);
    		
    		agg.addActionListener(new GBC(f,tp));
    		
    		
    	}
    	
    
    	public void refreshTab(JFrame f, JTabbedPane tp)
    
    	{
    		catTab=new Vector<JComponent>(0,1);
    		tp.removeAll();
    		for(int i=0;i<categorie.size();i++)
    		{
    		System.out.println("Numero Categorie:->"+categorie.size());
    		System.out.println("Numero Categoria attuale:->"+i);
    		
    		JComponent jc = new PanelSfondo(new File("sfondo.jpg"));
    		jc.setName(categorie.elementAt(i).nome());
    		System.out.println(jc.getName());
    		
    		catTab.add(jc); 
    		
    		//aggiungi i bottoni relativi alla categoria
    
    		JButton agg=new JButton("Aggiungi Elemento");
    		JButton del=new JButton("Rimuovi Elemento");
    		JButton rin=new JButton("Rinomina Elemento"); 
    		JButton delCat=new JButton("Elimina Categoria"); 
    		catTab.elementAt(i).add(agg);
    		catTab.elementAt(i).add(del);
    		catTab.elementAt(i).add(rin);
    		catTab.elementAt(i).add(delCat);
    		
    		agg.addActionListener(new GBC(f,tp));
    		
    		//aggiorno elementi
    
    		for(int j=0;j<categorie.elementAt(i).elementi().size();j++)
    		{
    			catTab.elementAt(i).add(categorie.elementAt(i).Rb().elementAt(j));
    		}
    
    		tp.addTab(categorie.elementAt(i).nome(),null,catTab.elementAt(catTab.size()-1),"Visualizza categoria"+categorie.elementAt(i).nome());
    		}
    		f.setVisible(false);
    		f.setVisible(true);
    		
    	}
    Qualcuno sa come aiutarmi?


    Per chi volesse qualche spiegazione in più di come funziona il programma:


    Sto costruendo un programma che permetta di creare “liste” di JradioButton;

    A questo proposito ho costruito la classe Lista che contiene un vettore di categorie(classe implementata da me) che contiene a sua volta il vettore dei JRadioButton per quella categoria);

    Ogni lista contiene quindi delle categorie che vengono visualizzate nel JPanel come Tab del JtabbedPane;

    Ogni categoria è di fatto un Jcomponent aggiunto alla tab, ed è proprio qui il problema:

    Dunque se non aggiungo le tab, il programma riesce a salvare e caricare correttamente tutto quanto...

    ...se invece utilizzo le funzioni (riportate qui sopra) che mi permettono di aggiungere al pannello le tab delle categorie con tutti gli elementi mi da errore nella fase di salvataggio e caricamento

    Spero di essere stato chiaro =)

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Moderazione

    Magari, meno tag COLOR (poco utili) e più tag CODE (obbligatori, come da Regolamento interno).

    Questi ultimi, almeno, mantengono la formattazione del codice e lo rendono leggibile.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Sarebbe utile che postassi anche lo stack trace dell'eccezione che viene generata.
    Cmq ad occhio controlla che la classe "PanelSfondo" sia serializzabile.

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    19
    Ok, scusa LeleFT =) farò più attenzione ^^

    Ecco l'errore che da in fase di salvataggio;
    Il PanelSfondo l'ho appena reso serializable ma la situazione non è cambiata =|


    codice:
            java.io.NotSerializableException: java.awt.image.BufferedImage
    	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    	at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
    	at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
    	at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
    	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    	at java.io.ObjectOutputStream.writeArray(Unknown Source)
    	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    	at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
    	at java.io.ObjectOutputStream.defaultWriteObject(Unknown Source)
    	at java.util.Vector.writeObject(Unknown Source)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    	at java.lang.reflect.Method.invoke(Unknown Source)
    	at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
    	at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
    	at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
    	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    	at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
    	at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
    	at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
    	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    	at java.io.ObjectOutputStream.writeObject(Unknown Source)
    	at GBL.Salva(GBL.java:218)
    	at GBL.actionPerformed(GBL.java:154)
    	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    	at java.awt.Component.processMouseEvent(Unknown Source)
    	at javax.swing.JComponent.processMouseEvent(Unknown Source)
    	at java.awt.Component.processEvent(Unknown Source)
    	at java.awt.Container.processEvent(Unknown Source)
    	at java.awt.Component.dispatchEventImpl(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Window.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    	at java.awt.EventQueue.access$000(Unknown Source)
    	at java.awt.EventQueue$1.run(Unknown Source)
    	at java.awt.EventQueue$1.run(Unknown Source)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    	at java.awt.EventQueue$2.run(Unknown Source)
    	at java.awt.EventQueue$2.run(Unknown Source)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    	at java.awt.EventQueue.dispatchEvent(Unknown Source)
    	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.run(Unknown Source)

  5. #5
    Implementare l'interfaccia serializable non vuoldire che l'oggetto sia serializzabile infatti dentro a questa classe hai dichiarato una proprietà di tipo BufferedImage che non è serializabile.
    Ti ricordo che per essere serializzato un oggetto ha bisogno che tutte le sue proprietà di instanza siano serializabili, oppure gestisci la metodologia con il quale salvare tale oggetto (metodo writeObject) e come rilegerlo (metodo readObject).
    Ps lo stacktrace dell'eccezione ti dice esattamente il motivo per il quale non viene serializzato:
    codice:
    java.io.NotSerializableException: java.awt.image.BufferedImage

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    19
    Grazie!
    Esiste un metodo per rendere serializabile anche buffered image?

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da zemy
    Esiste un metodo per rendere serializabile anche buffered image?
    L'unico modo per poterlo fare è estenderla ed implementare Serializable.

    Valuta, però, piuttosto l'opportunità di rendere quell'oggetto volatile, in modo da non doverlo serializzare, se non ne sei costretto. Oggetti come quelli, generalmente, sono "ricostruibili" a partire dal file fisico dell'immagine.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    19
    scusami ancora, potresti spiegarmi nello specifico cosa intendi col renderli volatili?
    Cosa dovrei fare? =P

    Grazie ancora! ^^

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Innanzitutto mi correggo... intendevo dire "transient" non "volatile" che serve ad altro.

    transient è un modificatore di tipo che serve ad indicare che quel campo di una classe non deve essere serializzato (né deserializzato, per controparte).

    Ora, non so come tu abbia dichiarato l'oggetto (se pubblico, privato, protected o nulla), ma, supponendo che sia un campo privato, invece di dichiarare l'oggetto semplicemente come

    codice:
    private BufferedImage bufImage;
    è sufficiente dichiararla in questo modo

    codice:
    private transient BufferedImage bufImage;
    e quell'oggetto non finirà nella serializzazione.

    Chiaramente, la sua ri-costruzione in fase di deserializzazione va fatta a mano subito dopo l'ottenimento dell'oggetto (per renderlo consistente).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    19
    Grazie infinite!
    Ora funziona tutto correttamente!

    Buona serata!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.