Newsgroup: it.comp.java
Titolo: Copia e incolla.... non scambia i dati tra diverse istanze dell'applicazione!

Volendo realizzare la funzione copia-incolla su alcuni dati di 
un'applicazione, ho implementato il codice allegato.
Funziona perfettamente all'interno di un'applicazione, ma se, da due 
finestre diverse, digito java CopiaIncolla, l'applicazione che gira in 
una finestra non riesce ad intercettare i dati dell'altra, dato che 
transferable.isDataFlavorSupported(dati.flavor) ritorna false, e il 
metodo input.dati.isDataFlavorSupported non viene mai richiamato (a 
differenza di quanto succede se l'operazione di copia è effettuata dalla 
stessa istanza dell'applicazione che ha effettuato la copia).
Ora, per conservare una copia di un'oggetto all'interno di una 
applicazione, non c'era bisogno di tutto questo casino: bastava clonare 
l'oggetto ed assegnarlo ad una variabile. C'è modo di effettuare il 
copia e incolla tra diverse istanze della jvm che eseguono lo stesso 
programma? Tra l'altro transferable.isDataFlavorSupported è un metodo 
astratto nella classe di SUN, per cui se non viene usato il metodo che 
ho implementato in input.dati non capisco dove sia l'implementazione 
alternativa.
Grazie
Marco
//++++++++++++++++++++++++
//file input/dati.java
//++++++++++++++++++++++++
package input;
import java.awt.datatransfer.DataFlavor;
public class dati implements java.awt.datatransfer.Transferable
  {
   public static final DataFlavor flavor;
   static
    {
     java.awt.datatransfer.DataFlavor flavor0;
     try
      {flavor0=new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType + 
";class=input.dati");}
     catch (java.lang.ClassNotFoundException e)
      {flavor0=null;}
     flavor=flavor0;
    }
   public Object getTransferData(DataFlavor flavor)
    {
     if (!flavor.equals(this.flavor))
      {return null;}
     return this;
    }
   public boolean isDataFlavorSupported(DataFlavor flavor)
    {
System.out.println("flavor.equals(this.flavor)="+flavor.equals(this.flavor));
     return flavor.equals(this.flavor);
    }
   public DataFlavor[] getTransferDataFlavors()
    {return new DataFlavor[]{flavor};}
//.....
  }
//++++++++++++++++++++++++
//file icopiaIncolla.java
//++++++++++++++++++++++++
public class copiaIncolla
  {
   private static final java.awt.datatransfer.Clipboard clipboard;
   static
    {
     java.awt.datatransfer.Clipboard clipboard0;
     try
      {clipboard0=Toolkit.getDefaultToolkit().getSystemClipboard();}
     catch (Exception e)
      {clipboard0=null;}
     clipboard=clipboard0;
    }
   public void copia()
    {
// se clicco su pulsante "Copia"
     if (clipboard!=null)
     {
       try
        {clipboard.setContents(input.dati(parametri),null);}
       catch (Exception e) {}
      }
    }
   public void incolla()
    {
//se clicco su pulxante "Incolla"
     if (clipboard!=null)
      {
       try
        {
         java.awt.datatransfer.Transferable 
transferable=clipboard.getContents(null);
System.out.println("dati.flavor"+dati.flavor+"\ntransferable.isDataFlavorSupported(dati.flavor)="+transferable.isDataFlavorSupported(dati.flavor));
         if (transferable.isDataFlavorSupported(dati.flavor))
            {input.dati 
appunti=(input.dati)transferable.getTransferData(dati.flavor);}}
       catch (Exception e) {}
      }
    }
//....
  }

 transferable.isDataFlavorSupported(dati.flavor) ritorna false
Ho risolto sostituendo
public class dati implements java.awt.datatransfer.Transferable
con
public class dati implements 
java.awt.datatransfer.Transferable,,java.io.Serializable
Praticamente, facendo in modo che la classe incriminata (e tutte quelle 
che usa) implementassero Serializable, riesco a trasferire dati da 
un'applicazione all'altra usando la funzione copia e incolla.