domingo, 4 de noviembre de 2012

Drag and Drop: cómo funciona

votar
¡Después de unos cuantos meses de ausencia, por fin he vuelto! No, no me he ido de vacaciones (que más quisiera), sino que el imponderable deber de tener que trabajar para vivir se interpuso entre este blog y yo. ¡Y mira que os pongo anuncios para que clickéis y me libréis de ese problema! Pero, nada, no os dáis por enterados. ;-)

Hablando ahora ya en serio, esta entrada esta dedicada al Drag and Drop. Para los que no sepáis lo que es, os diré que no se trata del nombre de un grupo pop, sino de ese efecto de arrastrar elementos de un lugar a otro, como cuando arrastramos ficheros de una carpeta al escritorio del ordenador.

En principio, todos los componentes de Swing soportan el Drag and Drop, pero algunos tienen instalada la forma de ejecutarlo por defecto y otros no. Para los primeros, basta con invocar el método setDragEnabled(true) y listo. Para los segundos, hay que escribir el código necesario para adaptarlo a tus necesidades.

Los componentes que tienen un mecanismo de arrastre por defecto son:
  • JColorChooser
  • JEditorPane
  • JFileChooser
  • JFormattedTextField
  • JList
  • JTable
  • JTextArea
  • JTextPane
  • JTree
En cuanto al mecanismo para "dejar caer" los datos que queremos transferir, en estos componentes no hay que hacer nada más:
  • JEditorPane
  • JFormattedTextField
  • JPasswordField
  • JTextArea
  • JTextField
  • JTextPane
  • JColorChooser
mietras que estos otros necesitan un poco más de código para funcionar:
  • JList
  • JTable
  • JTree
Para los componentes que no tienen un método de trasnferencia de datos por defecto, deberemos usar la clase TransferHandler.

A continuación voy a poneros un par de ejemplos, simplificados hasta el extremo, para que veáis el funcionamiento del Drag and Drop en Java. En el primero crearemos dos selectores de color y arrastraremos el color seleccionado en el primero hasta el segundo. Fijaos que no podemos arrastrar desde los cuadraditos pequeños, sino desde la vista previa. Este primer ejemplo es una adaptación del que podéis encontrar en la siguiente página.

import java.awt.BorderLayout;
import javax.swing.JColorChooser;
import javax.swing.JFrame;

public class DobleColor {
  public static void main(String args[]) {
    JFrame frame = new JFrame("Doble Selector de Color ");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JColorChooser izquierda = new JColorChooser();
    izquierda.setDragEnabled(true);
    frame.add(izquierda, BorderLayout.WEST);
    JColorChooser derecha = new JColorChooser();
    derecha.setDragEnabled(true);
    frame.add(derecha, BorderLayout.EAST);

    frame.pack();
    frame.setVisible(true);
  }
Podéis ver aquí cómo quedaría, tras haber arrastrado el color seleccionado desde el primero hasta el segundo.



En el siguiente ejemplo, vamos a arrastrar un texto desde una etiqueta o JLabel a un campo de texto o JTextField. Para ello utilizaremos los método setTransferHandler y getTransferHandler, además de crear un evento al presionar con el ratón, para que funcione el gesto de arrastrar.


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.JFrame;

public class SimpleDnDs extends JFrame{
    //Vamos a crear componentes
    private JTextField textField;
    private JLabel label;
    private JPanel panel;
 
 public static void main (String args[]){
     SimpleDnDs dnd = new SimpleDnDs();
 }
     
    public SimpleDnDs(){ //constructor de SimpleDnDs
      JFrame frame = new JFrame("Drag and Drop");
      panel = new JPanel();   
      textField = new JTextField(40);
      label = new JLabel("Este es el texto a arrastrar");
   
   //especificamos qué tipo de dato vamos a transferir
      label.setTransferHandler(new TransferHandler("text"));
      MouseListener ml = new MouseAdapter(){
     //creamos el método para transferir
     //datos al presionar con el ratón
        public void mousePressed(MouseEvent e){
        JComponent jc = (JComponent)e.getSource();
        TransferHandler th = jc.getTransferHandler();
        th.exportAsDrag(jc, e, TransferHandler.COPY);
        }
      };
      label.addMouseListener(ml);
   panel.add(label);
   panel.add(textField);
   frame.add(panel); //añadimos el panel al marco
      frame.setSize(600,600); //le ponemos las medidas que queramos
      frame.setLayout(new FlowLayout()); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setLocationRelativeTo(null);
      frame.setVisible(true); 
   }
}
Una vez ejecutado el programa, podréis arrastrar el texto desde la etiqueta al campo de texto. Es por supuesto muy sencillito, sólo para que veáis cómo funciona, y podáis crear vuestros propios programas, jugando con distintos componentes y tipos de datos a transferir.

Para ello, recomiendo a los que sepáis inglés que echéis un ojo al tutorial de Oracle sobre Drag and Drop. Y como siempre, si tenéis dudas o comentarios, ya sabéis cómo. Además, si queréis saber cuándo publico las siguientes entradas sin tener que estar pendientes del blog, os recomiendo que os suscribáis.


7 comentarios:

  1. ¡Hola! No conocía tu blog, me he enterado por casualidad al ver un comentario tuyo en google+. ¡Es magnífico, gracias! A ver si conseguimos desnulificarnos un poco.

    ResponderEliminar
  2. ¡Muchas gracias! Me alegro de que te haya gustado, es un placer escribir para gente tan maja.:-)

    ResponderEliminar
  3. Gracias por las entradas... estan buenisimas! ahora necesito ayuda con algunas cosas en java. responde este comentario para saber si estas activa sonia.

    ResponderEliminar
    Respuestas
    1. Muchas gracias a ti, Anónimo. Si por activa te refieres a que aún estoy viva, pues sí. Si te refieres a que hace un montón que no publico una entrada nueva, la verdad es que cada semana me digo que voy a sacar tiempo para hacerlo, pero nunca lo consigo.
      Pero mándame tus dudas e intentaré ayudarte. Aunque deberás tener paciencia: por la hora en la que enviaste tu comentario, me da que no estamos en el mismo huso horario.;-)
      ¡Un saludo!

      Eliminar
  4. Hola soy un estudiante de Ingeniería de Sistemas e Informatica. Me agrada mucho tu blog, te felicito pues es agradable conocer a personas que se interesan por instruir a quienes estamos en el camino del desarrollo y la programación.

    Un Saludo desde Colombia

    ResponderEliminar
    Respuestas
    1. Muchas gracias por tu amable comentario.
      Aunque considero que en el mundo de la programación, todos estamos aprendiendo, unos de otros.
      ¡Saludos a Colombia!

      Eliminar