El ejemplo de este artículo describe cómo Java utiliza la función de arrastrar y soltar del mouse para intercambiar datos del programa, que es la llamada función de arrastrar y soltar del mouse. La función de arrastrar y soltar del mouse se usa muy comúnmente en sistemas gráficos. Java proporciona los paquetes java.awt.dnd y java.awt.datatransfer para admitir esta función. Este ejemplo demuestra cómo implementar arrastrar y soltar en el programa. Cuando haces clic con el mouse en la etiqueta "¡Hola mundo!" en la parte superior de la ventana y la arrastras al cuadro de texto en la parte inferior de la ventana, "Hola". ¡Mundo!" se agregará al cuadro de texto. !" texto; continúe con el proceso anterior y el texto continuará agregándose.
Las ideas y métodos de implementación específicos de la función del programa son los siguientes: en la implementación de arrastrar y soltar con el mouse, los dos conceptos más importantes son arrastrar origen y soltar destino, es decir, arrastrar origen y soltar destino. El origen de arrastre y el destino de colocación están asociados con el componente visible (¿cómo se puede arrastrar si no está visible?). La esencia de la tecnología de arrastrar y soltar es transferir los datos del componente de origen de arrastrar y soltar al componente de destino de ubicación. Por lo tanto, desde una perspectiva de bajo nivel, arrastrar y soltar está muy cerca de la tecnología del portapapeles. en el ejemplo anterior.
Implementación de la fuente de arrastre: la clase de fuente de arrastre primero debe crear una instancia de DragGestureRecognizer, lo que indica que la clase es una clase de componente de fuente de arrastre o contiene un componente de fuente de arrastre. Esto se puede lograr llamando al método createDefaultDragGestureRecognizer() del objeto DataSource. La implementación específica es la siguiente:
int action = DnDConstants.ACTION_COPY_OR_MOVE; // Arrastrar y soltar tipo ds.createDefaultDragGestureRecognizer(this,action,this);
La declaración anterior muestra que el componente de origen de arrastre es un objeto de instancia de esta clase en sí, el tipo de arrastrar y soltar que se completará es del tipo DnDConstants.ACTION_COPY_OR_MOVE, y la clase que implementa la interfaz DragGestureListener es esta clase. La fuente de arrastre generalmente implementa la interfaz DragGestureListener, que define un método dragGestureRecognized(). Cuando comienza el arrastre, DragGestureListener escucha el evento y luego lo transfiere al método dragGestureRecognized() para procesar el evento, como enviar los datos del arrastre. fuente. Código específico:
public void dragGestureRecognized(DragGestureEvent dge) {//throw new java.lang.UnsupportedOperationException("El método dragGestureRecognized() aún no está implementado."); try{Transferable tr = new StringSelection(this.getText()); Texto como datos, por Transferible Empaquetado de objetos // Comience a arrastrar, establezca el cursor en la forma DragSource.DefaultCopyNoDrop, los datos de arrastrar y soltar son un objeto tr y DragSourceListener es esta clase dge.startDrag(DragSource.DefaultCopyNoDrop,tr,this);}catch(Exception err) {err. imprimirStackTrace();}}
La fuente de arrastre también debe implementar la interfaz DragSourceListener, que define métodos de manejo de eventos para cada estado relacionado con arrastrar y soltar. Como dragEnter, dragOver, dropActionChanged, dragExit y otros métodos. En este ejemplo, se implementará el método dragEnter() para establecer la forma del cursor durante el arrastre, y otros métodos serán métodos vacíos. El código de implementación específico es el siguiente:
public void dragEnter(DragSourceDragEvent dsde) {//throw new java.lang.UnsupportedOperationException("El método dragEnter() aún no está implementado.");DragSourceContext dsc = dsde.getDragSourceContext() //Obtener la referencia de contexto de la fuente de arrastre/ / Establece la forma del cursor al arrastrar int action = dsde.getDropAction();if ((action&DnDConstants.ACTION_COPY)!=0)dsc.setCursor(DragSource.DefaultCopyDrop);elsedsc.setCursor(DragSource.DefaultCopyNoDrop);}
Implementación del destino de colocación: primero se debe crear una instancia de DragTarget en la clase de destino de colocación para indicar que esta clase es una clase de componente de destino de colocación o contiene un componente de destino de colocación. La implementación es la siguiente:
nuevo DropTarget(this.jTextField1,DnDConstants.ACTION_COPY_OR_MOVE,this);
La declaración anterior muestra que el destino de colocación es este objeto.jTextField1, la operación de arrastrar y soltar es de tipo DnDConstants.ACTION_COPY_OR_MOVE y la clase que implementa la interfaz DropTargetListener es esta clase. En correspondencia con DrafSourceListener, el destino de colocación o su clase generalmente implementa la interfaz DropTargetListener. Esta interfaz también define muchos métodos, como dragEnter, dragOver, etc., para manejar eventos cuando el proceso de arrastrar y soltar entra en diferentes etapas. Este ejemplo solo se preocupa por el método drop(), que es el procesamiento de eventos cuando se suelta el mouse sobre el componente de destino de ubicación. Generalmente se usa para procesar los datos pasados. Por ejemplo, en este ejemplo, se pasarán los datos de texto. mostrado en el componente JTextField Otros El método es un método vacío, el código específico es el siguiente:
public void drop(DropTargetDropEvent dtde) {//throw new java.lang.UnsupportedOperationException("El método drop() aún no está implementado.");try{Transferable tr = dtde.getTransferable() //Obtener el objeto de datos pasado/ / Procese el objeto de datos y obtenga la información de texto si (dtde.isDataFlavorSupported(DataFlavor.stringFlavor)){dtde.acceptDrop(dtde.getDropAction());String s = (String) tr.getTransferData(DataFlavor.stringFlavor);this.jTextField1.setText(this.jTextField1.getText() +s); //Muestra la información de texto pasada desde la fuente de arrastre en el destino de colocación dtde.dropComplete(true);}else{dtde.rejectDrop();}}catch(Exception err){err.printStackTrace();}}
Código de programa:
1. Cree un nuevo proyecto y asígnele el nombre JDragAndDropDemo.
2. Cree una nueva aplicación y asígnele el nombre JDragAndDropDemo; asigne a la ventana principal el nombre MainFrame y asígnele el título JDragAndDropDemo.
3. Cree una nueva clase, asígnele el nombre DragJLabel y herede la clase JLabel.
4. Utilice la interfaz Wizards|Implements para hacer que la clase DragJLabel implemente las interfaces DragGestureListener y DragSourceListener.
5. Agregue un nuevo atributo DragSource ds en la clase DragJLabel, el código es el siguiente:
clase DragJLabel extiende JLabel implementa DragGestureListener, DragSourceListener {DragSource ds = DragSource.getDefaultDragSource() //Crea una instancia de DragSource...}
6. Escriba el método constructor de la clase DragJLabel.
public DragJLabel(String title,int alineación){super(title,alignment); //Utilice el método de clase principal int action = DnDConstants.ACTION_COPY_OR_MOVE;ds.createDefaultDragGestureRecognizer(this,action,this);
7. Implemente el método dragGestureRecognized() en la clase DragJLabel, ajuste y envíe datos.
public void dragGestureRecognized(DragGestureEvent dge) {//throw new java.lang.UnsupportedOperationException("El método dragGestureRecognized() aún no está implementado.");try{Transferable tr = new StringSelection(this.getText());dge.startDrag(DragSource .DefaultCopyNoDrop,tr,this);}catch(Excepción err){err.printStackTrace();}}
8. Implemente el método dragEnter() en la clase DragJLabel para establecer la forma del cursor.
public void dragEnter(DragSourceDragEvent dsde) {//throw new java.lang.UnsupportedOperationException("El método dragEnter() aún no está implementado.");DragSourceContext dsc = dsde.getDragSourceContext();int action = dsde.getDropAction();if ((action&DnDConstants.ACTION_COPY)!=0)dsc.setCursor(DragSource.DefaultCopyDrop);elsedsc.setCursor(DragSource.DefaultCopyNoDrop);}
9. Agregue un componente JTextField en la parte inferior de la ventana de diseño de la clase MainFrame y cree una instancia de DragJLabel en la clase. El código específico es el siguiente:
la clase pública MainFrame extiende JFrame implementa DropTargetListener {private JPanel contentPane;private BorderLayout borderLayout1 = new BorderLayout();private JTextField jTextField1 = new JTextField();DragJLabel label = new DragJLabel("¡Hola mundo!",SwingConstants.CENTER);……}
10. Escriba el método de inicialización jbInit () de la clase MainFrame, establezca las propiedades iniciales del componente y cree una nueva instancia de DropTarget. El código es el siguiente:
private void jbInit() lanza una excepción {//setIconImage(Toolkit.getDefaultToolkit().createImage(MainFrame.class.getResource("[Su icono]")));contentPane = (JPanel) this.getContentPane();contentPane.setLayout (borderLayout1);this.setSize(nueva Dimensión(410, 114));this.setTitle("JDragAndDropDemo");jTextField1.setFont(new java.awt.Font("Dialog", 0, 14));contentPane.add(jTextField1, BorderLayout.SOUTH);contentPane.add(this .label,BorderLayout.NORTH);nuevo DropTarget(this.jTextField1,DnDConstants.ACTION_COPY_OR_MOVE,this);}
11. Utilice la interfaz Wizards|Implements para hacer que la clase MainFrame implemente la interfaz DropTargetListener.
12. Implemente el método drop () heredado de la interfaz DropTargetListener para procesar los datos pasados. El código específico es el siguiente:
public void drop(DropTargetDropEvent dtde) {//throw new java.lang.UnsupportedOperationException("El método drop() aún no está implementado.");try{Transferable tr = dtde.getTransferable();if (dtde.isDataFlavorSupported(DataFlavor.stringFlavor)){dtde.acceptDrop(dtde.getDropAction());String s = (String) tr.getTransferData(DataFlavor.stringFlavor);this.jTextField1.setText(this.jTextField1.getText()+s);dtde.dropComplete(true);}else{dtde.rejectDrop();}}catch(Exception err){ err.printStackTrace();}}