¿como detectar cuando alguien copia algo al portapapeles? java

Iniciado por p4nd4criss, 4 Junio 2012, 01:52 AM

0 Miembros y 1 Visitante están viendo este tema.

p4nd4criss

ha algún evento k me alerte cuando alguien copia algo al porta-papeles
ya conozco la solución de LOSTOWNERSHIP
incluso aki tengo el codigo

import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.FlavorEvent;
import java.awt.datatransfer.FlavorListener;
import java.awt.datatransfer.Transferable;

public class ClipboardTextListener {

Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
Owner owner = new Owner();
   public void comienzaAEscuchar () {
       
       
       cb.addFlavorListener(new CentinelaFlavor (cb) );
       Transferable contents = cb.getContents(owner);
       cb.setContents(contents, owner);
   }
   class Owner implements ClipboardOwner{
       @Override
       public void lostOwnership(Clipboard clipboard, Transferable contents) {
           try {Transferable newContents = clipboard.getContents(this);
           if (contents.getTransferData(DataFlavor.stringFlavor).equals(newContents.getTransferData(DataFlavor.stringFlavor)))  return;
           clipboard.setContents(newContents, this);
           System.out.println("a");
           textoHaCambiado ( (String) clipboard.getData(DataFlavor.stringFlavor));
           } catch (Exception e) {
               System.out.println ("No fue texto"); //Puedes borrar esto
           }
       }
   }
   class CentinelaFlavor implements FlavorListener {
       private Clipboard c;
       public CentinelaFlavor (Clipboard c) {
           this.c = c;
       }
       public void flavorsChanged(FlavorEvent e) {
           try {
               System.out.println("b");
               Owner o = new Owner();
               String nuevaString = (String) c.getContents(o).getTransferData(DataFlavor.stringFlavor);
               c.setContents(c.getContents(o), new Owner() );
               textoHaCambiado ( nuevaString);
           } catch (Exception ex) {System.out.println ("No fue texto 2");/*Puedes borrar este*/ }
       }
   }
   protected void textoHaCambiado(String nuevoTexto) {
       System.out.println(nuevoTexto);

   }
}

cuando alguien reemplaza el contenido del portapapeles lee el nuevo contenido y vuelve a subir ese contenido declarando ownership otra ves

pero surge un problema si mas de una aplicación hace esto
digamos si el Jdownloader esta funcionando al mismo tiempo, y copio algun texto ambos programas
se pelean por el portapepeles

uno le quita ownership al otro, y el otro se la vuelve a quitar al primero ,causando k el primero se la quite al segundo.......

existe alguna otra solución?
algun evento que escuche el portapepeles?

gracias gente :3