Drag and drop de painéis - dúvida

0 respostas
kaberdock

Estou tentando aprender como implementar drag and drop, consegui uns tutoriais e tentei modifica-los porém sem exito. Se alguem puder descobrir o erro por favor me ajude.

esta classe seria o painel que seria “dragavél”

package br.teste.dnd.testedndpanel;



import java.awt.Color;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class DnDPanel extends JPanel implements Transferable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	
	public DnDPanel(String label){
		this.setSize(30,30);
		this.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
		this.setBackground(Color.BLUE);
		this.add(new JLabel(label) );
		this.addMouseListener(new DraggableMouseListener());
		this.setTransferHandler(new PanelTransferHandler());
		
	}
	
	/***
	 * Esta função retorna o dado a ser transferido, neste caso o painel
	 * 
	 */
	public Object getTransferData(DataFlavor flavor) {
		DataFlavor thisFlavor = null;

		try {
			thisFlavor = DnDFrame.getDragAndDropDataFlavor();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			return null;
		}
		if (thisFlavor != null && thisFlavor.equals(flavor)) {
			return this;
		}
		return null;

	}

	/***
	 * Esta função faz parte das tres funções fundamentais do Dnd. Ela retorna
	 * os tipos possiveis de dados transferiveis.
	 */
	public DataFlavor[] getTransferDataFlavors() {
		DataFlavor flavors[] = { null };

		try {
			flavors[0] = DnDFrame.getDragAndDropDataFlavor();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			return null;
		}

		return flavors;
	}
	/***
	 * Também faz parte das tres funções fundamentais do dnd
	 * ela verifica se o dado que estão tentando transmitir é compativel com os que a classe trabalha
	 */
	public boolean isDataFlavorSupported(DataFlavor flavor) {
		DataFlavor flavors[] = { null };

		try {
			flavors[0] = DnDFrame.getDragAndDropDataFlavor();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			
		}
		for(DataFlavor f : flavors){
			if(f.equals(flavor))
				return true;
		}
		return false;
	}

}

Este painel conteria os painéis dragaveis

/***
 * Este painel será onde os outros paineis serão colocados.
 */

package br.teste.dnd.testedndpanel;

import java.awt.dnd.DropTarget;

import javax.swing.GroupLayout;
import javax.swing.JPanel;

public class DropPanel extends JPanel{
	
	/**
	 * 
	 */
	
	private GroupLayout layout;
	private GroupLayout.ParallelGroup hGroup;
	private GroupLayout.SequentialGroup vGroup;
	private static final long serialVersionUID = 1L;
	private DnDFrame frame;
	
	public DropPanel(DnDFrame frame){
		super();
		//this.setSize(800,600);
		this.frame = frame;
		this.layout = new GroupLayout(this);
		this.setLayout(layout);
		this.hGroup = this.layout.createParallelGroup();
		this.vGroup = this.layout.createSequentialGroup();
		this.layout.setHorizontalGroup(hGroup);
		this.layout.setVerticalGroup(vGroup);
		layout.setAutoCreateContainerGaps(true);
		layout.setAutoCreateGaps(true);
		this.setTransferHandler(new PanelTransferHandler());
		this.addMouseListener(new DraggableMouseListener());
		this.setDropTarget(new DropTarget(this, new PanelDropTargetListener(this)));
	}
	
	public DnDFrame getFrame(){
		return this.frame;
	}
	
	public void addItem(DnDPanel p){
		this.hGroup.addComponent(p);
		this.vGroup.addComponent(p);
		this.revalidate();
	}
	

}

O tansferHandler

/***
 * Esta classe é responsavél por intermediar a ação de Dnd entre os componentes,
 * é nela onde ficam as regras de transferencia.
 */

package br.teste.dnd.testedndpanel;

import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;

import javax.swing.JComponent;
import javax.swing.TransferHandler;

public class PanelTransferHandler extends TransferHandler {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private DnDPanel dnd;
	
	public PanelTransferHandler() {
		super();
	}

	/***
	 * Esta função transforma o componente em Transferable, o caso os nossos
	 * DnDPanel
	 */
	public Transferable createTransferable(JComponent c) {
		if (c instanceof DnDPanel) {
			Transferable t = (DnDPanel) c;
			return t;
		}
		return null;
	}
	
	
	public boolean importData(JComponent c, Transferable t){
		if(c instanceof DropPanel){
			DropPanel d = (DropPanel)c;
			try {
				this.dnd = (DnDPanel) t.getTransferData(DnDFrame.getDragAndDropDataFlavor());
				d.addItem(dnd);
				return true;
			} catch (UnsupportedFlavorException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return false;
	}
	/***
	 * retorna o tipo de ação a ser feita com o componente, mover, copiar ou os dois.
	 * @param c
	 * @return
	 */
	public int GetSourceActions(JComponent c){
		if(c instanceof DnDPanel){
			return TransferHandler.COPY;
		}
		return TransferHandler.NONE;
	}

}

no caso do tutorial que eu vi fazendo drag’n drop de um painel ele utilizava esta classe dropTarget, em outro que fazia drag’n drop de ícones ele utilizava a importdata do transferhandler, mas no meu caso nenhuma das duas funcionou

package br.teste.dnd.testedndpanel;

import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DropTargetContext;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.io.IOException;

public class PanelDropTargetListener implements DropTargetListener{

	DropPanel panel;
	
	public PanelDropTargetListener(DropPanel panel){
		this.panel = panel;
	}
	@Override
	public void dragEnter(DropTargetDragEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void dragExit(DropTargetEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void dragOver(DropTargetDragEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void drop(DropTargetDropEvent e) {
		// TODO Auto-generated method stub
		DataFlavor flavor = null;
		Object transferableObj = null;
		Transferable transferable = null;
		DnDPanel p = null;
		
		try {
			flavor = DnDFrame.getDragAndDropDataFlavor();
			transferable = e.getTransferable();
			DropTargetContext c  = e.getDropTargetContext();
			if(transferable.isDataFlavorSupported(flavor)){
				transferableObj = e.getTransferable().getTransferData(flavor);
				p = (DnDPanel)transferableObj;
				this.panel.add(p);
			}
		} catch (ClassNotFoundException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (UnsupportedFlavorException e2) {
			// TODO Auto-generated catch block
			e2.printStackTrace();
		} catch (IOException e3) {
			// TODO Auto-generated catch block
			e3.printStackTrace();
		}
		
		
		
	}

	@Override
	public void dropActionChanged(DropTargetDragEvent arg0) {
		// TODO Auto-generated method stub
		
	}

}
Criado 1 de setembro de 2011
Respostas 0
Participantes 1