Drag-And-Drop Aplicações Swing em Java – Parte 03

 

Aprenda a usar as classes de Drag-and-Drop do Java Swing através de um exemplo prático.

Por: Francisco Voccio Netto

Lado Drag

Vamos começar falando sobre a interface DragGestureListener, desenvolvi uma classe que implementa esta interface como mostra a listagem 2.

Listagem 2. OuvinteDrag.java

package br.javamagazine.dnd;

import java.awt.datatransfer.Transferable;
import java.awt.dnd.*;
import br.javamagazine.botoes.Botao;

public class OuvinteDrag implements DragGestureListener {

  private static final long serialVersionUID = 2348726570484800827L;
  private Botao botaoDrag;

public OuvinteDrag(Botao botao) {
    this.botaoDrag = botao;
  }

 

  public void dragGestureRecognized(DragGestureEvent e) {

    if ((e.getDragAction() & botaoDrag.obterAcaoDrag()) == 0) { return; }

 

    if (botaoDrag instanceof ComponenteDragImpl) {

 

      Transferable transferable = new GerenciadorDeTransferencia(this.botaoDrag);

 

      try {

        e.startDrag(DragSource.DefaultCopyNoDrop, transferable, this.botaoDrag

            .obterDSListener());

 

      }

      catch (InvalidDnDOperationException idoe) {

        //Tratar

      }

    }

  }

}

Note que o método dragGestureRecognized é o nosso ponto de partida para o evento Drag, pois com ele nós passamos nosso gerenciador e o botão do menu, e com isso, informamos o domínio que o usuário está arrastando um objeto.


Ainda no âmbito Drag, temos uma outra importante classe para desenvolvermos: a classe OuvinteDragSource (Listagem 3). Ela é responsável por “ditar” o comportamento da nossa aplicação enquanto o usuário estiver arrastando o mouse.

Listagem 3. OuvinteDragSource
.java

 

package br.javamagazine.dnd;

 

import java.awt.dnd.*;

import br.javamagazine.botoes.Botao;

import br.javamagazine.telas.Editor;

 

public class OuvinteDragSource implements DragSourceListener {

 

  private static final long serialVersionUID = 1L;

  private Botao botaoDrag;

 

  public OuvinteDragSource(Botao botaoDrag) {

    this.botaoDrag = botaoDrag;

  }

 

 

  public void dragDropEnd(DragSourceDropEvent e) {

    if (!e.getDropSuccess()) { return; }

  }

 

  public void dragEnter(DragSourceDragEvent e) {

    DragSourceContext context = e.getDragSourceContext();

    // obtem qual acao será feita pelo drop

    int minhaAcao = e.getDropAction();

 

    if ((minhaAcao & botaoDrag.obterAcaoDrag()) != 0) {

      context.setCursor(DragSource.DefaultCopyDrop);

      if (e.getDragSourceContext().getComponent() instanceof Editor) {

        context.setCursor(DragSource.DefaultMoveDrop);

      }

 

    }

    else {

      context.setCursor(DragSource.DefaultCopyNoDrop);

    }

  }

 

  public void dragOver(DragSourceDragEvent e) {}

 

  /**

   * Quando o usuário sair do editor com o evento de drag,

   * o mouse irá sinalizar movimento ilegal.

   */

  public void dragExit(DragSourceEvent e) {

    DragSourceContext context = e.getDragSourceContext();

    context.setCursor(DragSource.DefaultCopyNoDrop);

  }

 

  /**

   * Caso o usuário aperte a tecla shift este evento será chamado como se

   * fosse um "link"

   */

  public void dropActionChanged(DragSourceDragEvent e) {

    DragSourceContext context = e.getDragSourceContext();

    context.setCursor(DragSource.DefaultCopyNoDrop);

  }

}

Nesta classe podemos ressaltar os métodos dragEnter, dragOver e dragExit, esses são os métodos que descrevem o comportamento da nossa aplicação.

Nota: reparem que obtenho sempre o contexto da aplicação drag e utilizo constantes da classe DragSource para definir quais os ícones do mouse nossa aplicação usará.


  • Em casos específicos esses ícones poderão ser personalizados.