Foros del Web » Programación para mayores de 30 ;) » Java »

Drop sobre componente

Estas en el tema de Drop sobre componente en el foro de Java en Foros del Web. Hola, Me gustaría saber qué tengo que hacer (usar un evento, usar una interfaz, ...) para conseguir que, al arrastrar algo (algo externo a mi ...
  #1 (permalink)  
Antiguo 25/01/2011, 02:30
Avatar de elangelcaido  
Fecha de Ingreso: septiembre-2003
Ubicación: Oviedo
Mensajes: 1.068
Antigüedad: 20 años, 7 meses
Puntos: 4
Drop sobre componente

Hola,

Me gustaría saber qué tengo que hacer (usar un evento, usar una interfaz, ...) para conseguir que, al arrastrar algo (algo externo a mi aplicación, como una imagen) sobre un componente de mi aplicación (como un JFrame), se realice alguna acción.

Gracias por la ayuda.
__________________
Ta Luego! Al final sólo puede quedar uno...
________
lukos.org
  #2 (permalink)  
Antiguo 25/01/2011, 03:28
Avatar de elangelcaido  
Fecha de Ingreso: septiembre-2003
Ubicación: Oviedo
Mensajes: 1.068
Antigüedad: 20 años, 7 meses
Puntos: 4
Respuesta: Drop sobre componente

Hola,

Me autorespondo. Lo que hay que hacer es añadirle, al componente que queremos que tenga la capacidad de manejar "cosas" que se arrastren sobre él, un objeto TransferHandler. Este objeto TransferHandler debe tener sobre-escritos los archivos conImport() y importData() (este último es donde haremos la verdadera gestión).

Os dejo el ejemplo que he hecho:

Código:
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.TransferHandler;


public class PruebaDropExterno extends JFrame {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JPanel panel=new JPanel();
	private TransferHandler manejador;

	public PruebaDropExterno(){
		super("PruebaDropExterno");
		
		add(panel);
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(800, 600);
        setLocationRelativeTo(null);
        setVisible(true);
        
        crearManejador();
        
        panel.setTransferHandler(manejador);
	}
	
	private void crearManejador(){
		manejador=new TransferHandler(){
			@Override
			public boolean canImport(TransferSupport support) {
				System.out.println("PruebaDropExterno:crearManejador:canImport()");
				if (!support.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
	                return false;
	            }
				boolean copySupported = (COPY & support.getSourceDropActions()) == COPY;

	            if (!copySupported) {
	            	return false;
	            }

	            support.setDropAction(COPY);
				return true;
			}
			public boolean importData(TransferSupport support) {
				System.out.println("PruebaDropExterno:crearManejador:importData()");
				if (!canImport(support)) {
	                return false;
	            }
				Transferable t = support.getTransferable();
				
				try {
					Object a=t.getTransferData(DataFlavor.stringFlavor);
					System.out.println(a);
				} catch (UnsupportedFlavorException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
				return true;
			};
		};
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new PruebaDropExterno();
	}

}
Para probarlo, pinchar y arrastrar sobre la ventana un documento de texto que tengáis en un directorio.

Un ejemplo más completo en http://download.oracle.com/javase/tu...ferHandlerDemo

Más ejemplos de pinchar y arrastran en http://www.java2s.com/Tutorial/Java/...tforImages.htm

Un saludo.
__________________
Ta Luego! Al final sólo puede quedar uno...
________
lukos.org

Etiquetas: componente, drop
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:51.