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
}
}