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.