Ajuda Drag and Drop

2 respostas
kleberkruger

Olá pessoal, estou desenvolvendo uma ferramenta que desenha algumas formas.
Nessa ferramenta tenho uma paleta de componentes, assim como no CorelDRAW, Photoshop, etc

Depois de muito estudo consegui utilizar o listener DragGestureListener, onde o usuário seleciona um componente na paleta e ARRASTA até o canvas.
Porém, o ideal seria construir uma espécie de “MoveAndDrop”, ou seja, em vez do usuário selecionar o elemento e precisar ARRASTAR até o canvas, o usuário precisaria apenas selecionar o elemento na paleta e MOVER até o canvas, assim como no CorelDRAW.

Aqui vai uma parte do código onde eu crio o evento:

...
DragGestureListener dragListener = new DragGestureListener() {

       public void dragGestureRecognized(DragGestureEvent e) {
            e.startDrag(null , transferableObject);
       }
};

        DragSource dragSource = new DragSource();
        dragSource.createDefaultDragGestureRecognizer(botao,
                DnDConstants.ACTION_COPY, dragGestureListener);
...

Pensei em duas maneiras de tentar solucionar esse problema, uma delas é implementar um DragAndDrop “personalizado”, onde o processo de drag seria feito no evento mouseMoved em vez do mouseDragged. Outra, acho que bem mais fácil, é no evento mouseMoved invocar o evento mouseDragged, porém, não sei exatamente como faço isso, apenas o comando mouseDragged(evento) não funciona. =/

Alguem me ajuda?
-

Desde já, agradeço qualquer contribuição
valew pessoal

2 Respostas

ViniGodoy

Eu faria do jeito personalizado. O drag and drop é realmente quando você tem a ação de “drag” (arrasto).

Além disso, ele é mais útil quando vc está arrastando coisas entre objetos diferentes, e foi feito de maneira tão complexa para suportar ações quando os objetos estão em aplicações diferentes.

Para aplicações gráficas no geral (como fazer seu próprio corel ou paint) eu geralmente prefiro desenhar tudo no braço. Não só dá um efeito mais bonito, como permite a criação de ferramentas mais sofisticadas, como outline das formas que serão desenhadas, inserção de bordas-guia, etc. Foi assim que fiz no editor de fases do caça à bandeira.

O drag&drop deixe para componentes mesmo, estilo Windows, quando tiverem que fazer ações típicas de componentes, sem muita mudança do comportamento padrão.

kleberkruger

ViniGodoy:
Eu faria do jeito personalizado. O drag and drop é realmente quando você tem a ação de “drag” (arrasto).

Além disso, ele é mais útil quando vc está arrastando coisas entre objetos diferentes, e foi feito de maneira tão complexa para suportar ações quando os objetos estão em aplicações diferentes.

Para aplicações gráficas no geral (como fazer seu próprio corel ou paint) eu geralmente prefiro desenhar tudo no braço. Não só dá um efeito mais bonito, como permite a criação de ferramentas mais sofisticadas, como outline das formas que serão desenhadas, inserção de bordas-guia, etc. Foi assim que fiz no editor de fases do caça à bandeira.

O drag&drop deixe para componentes mesmo, estilo Windows, quando tiverem que fazer ações típicas de componentes, sem muita mudança do comportamento padrão.

Olá Vini, primeiramente quero agradecer a tua contribuição, é sempre bom contar com a ajuda de pessoas experientes na linguagem! (aliás, qualquer ajuda é sempre bem vinda) =)
Mas quanto ao drag and drop “personalizado”, eu não consegui resolver meu problema. Tentei a partir do evento mouseMoved() do canvas invocar o evento mouseDragged() do componente da paleta.

Obs: Lembrando que o processo de DnD é gerado quando o componente da paleta é arrastado, ou seja, quando o mesmo recebe um evento de mouseDragged

Ficou assim:

// ** Listener que identifica os eventos de movimento sobre o canvas ** //

// Quando o mouse se movimenta sobre o canvas com um botão selecionado na paleta, 
// significa que estou querendo inserir um objeto, então meu componente da paleta deverá simular um processo de "drag"
public void mouseMoved(MouseEvent e) {
     // componente : é o componente vigiado pelo evento de drag and drop
     for (MouseListener listener : componente.getMouseListeners()) {
          listener.mousePressed(e);
     }
}

Porém num deu certo, parece que quando entra em processo de drag, esse método do MouseMotionListener do componente acaba não sendo chamado, provavelmente o DragGestureListener utiliza métodos de MouseMotion próprios.

Na classe DragSource tem o método createDefaultDragGestureRecognizer() que cria um DnD ao estilo tradicional, então eu gostaria de saber o seguinte:

Como faço pra criar esse drag and drop “personalizado”? Qual método deverei sobrescrever para alterar a maneira com que ele faz drag?

Criado 20 de junho de 2010
Ultima resposta 23 de jun. de 2010
Respostas 2
Participantes 2