Drag-And-Drop
Aplicações Swing em Java – Parte 02
Aprenda
a usar as classes de Drag-and-Drop do Java Swing através de um exemplo prático.
Por: Francisco Voccio Netto
Começando a implementação da camada de
transferência
Precisamos implementar uma classe
que seja o gerenciador das transferências. Este gerenciador ficará responsável
por ditar as regras do nosso exemplo.
Estarei implementando nossa classe GerenciadorDeTransferencia.java,
sendo que esta classe, por sua vez, deverá implementar a interface Transferable.
Pergunta: Mas porque preciso implementar essa interface?!
Resposta:
Precisamos implementar essa
interface porque necessitamos definir quais são nossos flavors. Flavors são objetos
da classe DataFlavor. Se fôssemos traduzir para o
português seria algo como os “sabores”! Sabores lembram escolhas, certo? Muito
bem, definimos quais são os tipos de Drag-and-Drop que a nossa aplicação irá
obedecer.
Escolheremos o tipo GerenciadorDeTransferencia.localStringFlavor que
possibilitará a transferência de objetos na mesma instância da aplicação.
A implementação é feita como mostra a Listagem 1.
Listagem 1. GerenciadorDeTransferencia.java
package br.javamagazine.dnd;
import java.awt.datatransfer.*;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import br.javamagazine.botoes.Botao;
public class GerenciadorDeTransferencia implements Transferable
{
public static final DataFlavor
localStringFlavor = DataFlavor.stringFlavor;
public static final DataFlavor[]
flavors = { GerenciadorDeTransferencia.localStringFlavor };
private static final List
flavorList = Arrays.asList(flavors);
private Botao botao;
private DataFlavor nossaOpcao;
public GerenciadorDeTransferencia() {
definirOpcaoDnD();
}
public
GerenciadorDeTransferencia(Botao botao) {
this();
this.botao = botao;
}
private void definirOpcaoDnD() {
try {
nossaOpcao = new
DataFlavor(DataFlavor.javaJVMLocalObjectMimeType
+ ";class=br.javamagazine.telas.util.PainelContainer");
}
catch (ClassNotFoundException ex) {
//tratar
}
}
public synchronized DataFlavor[]
getTransferDataFlavors() {
return flavors;
}
public boolean isDataFlavorSupported(DataFlavor
flavor) {
return (flavorList.contains(flavor));
}
public synchronized Object
getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException,
IOException
{
if (flavor.equals(nossaOpcao)) {
return this.botao;
}
else {
throw new
UnsupportedFlavorException(flavor);
}
}
public
DataFlavor obterNossaOpcao() {
return
nossaOpcao;
}
}
Agora
que temos nosso gerenciador configurado, podemos dar início às camadas do DnD.
Como o próprio nome já diz, precisamos pensar nas duas faces separadamente: o
lado do Drag (desenvolveremos os DragGestureListener) e o lado do Drop
(DropTargetListener).
Essas
duas interfaces são de extrema importância para que tenhamos o DnD com uma
ótima funcionalidade.