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.