lunes, 20 de diciembre de 2010

Métodos para el Drag and Drop en Java

Una de las cosas que se ha cambiado en la implementación de Java 6 es la manera en que se realizan los drag and drops (DnD) entre los componentes. No tengo ni idea de como funcionaba antes, pero por lo que he leído y me han contado, era bastante más complicado que como se puede hacer ahora.

Lo primero que se debe saber es que todo gira en torno a la clase TransferHandler. Muchos de los componentes de Swing ya vienen con un "Transfer Handler" por defecto, que en muchos casos será suficiente para nuestros propósitos.

Para comenzar a utilizar un TransferHandler en nuestro componente, existen tres métodos que deberemos emplear:

A continuación, existen dos tipos de métodos: los métodos para exportar datos y los métodos para importar datos.

Los primeros se utilizan para exportar los datos desde un componente cuando se comienza un gesto de arrastrar (drag) o cuando se copia o corta desde el componente con el que estamos trabajando. Estos métodos son:
  • getSourceActions(JComponent) - indicará qué acciones se permiten con los elementos del componente: copiar, mover o ambos. Este método se llamará automáticamente al comienzo del drag o arrastre.
  • createTransferable(JComponent) - este es el método más importante de todos ya que es el encargado de preparar los datos que se desean exportar: todo un objeto propio, sólo un String con el nombre, el id... Devuelve un objeto de tipo Transferable
  • exportDone(JComponent, Transferable, int) - este método se llama una vez que se ha terminado el drag and drop y en él se deben implementar las acciones necesarias después de la exportación (por ejemplo, después de mover un elemento, se debe eliminar de su ubicación original).

A continuación, los métodos empleados para importar datos cuando se suelta un objeto sobre un componente o cuando se pega desde el portapapeles:
  • canImport(TransferHandler.TransferSupport) - este método se llama de manera constante mientras se está haciendo un drag and drop y nos indica si el componente que se encuentra debajo del cursor del ratón aceptará los datos (return true) o si de lo contrario los rechazará (return false).
  • importData(TransferHandler.TransferSupport) - este método se invoca en el momento que se suelta sobre un componente terminando el drag and drop. Realiza las acciones necesarias para insertar los datos desde el origen hasta este punto y devuelve true en caso de una importación satisfactoria y false en caso contrario.

Por último, es necesario indicar la función de la clase TransferSupport, una clase interna de TransferHandler y que permite que se realice la transferencia de los datos entre el origen y el destino.Esta clase nos ofrece información acerca de la transferencia como el componente destino, la acción que se va a realizar (copiar o mover), los datos que se están transfiriendo, si se soporta ciertos tipos de datos, la localización exacta del componente destino...

Con estos métodos se puede realizar drag and drop en java, la lógica a aplicar en cada uno de ellos depende de nuestra aplicación en cuestión.

Tutorial completo