2012-06-06 18 views
9

Arrastrar y soltar personalizado de Java: no se realizan devoluciones de llamadas a TransferHandler.Arrastrar y soltar personalizado de Java en JPanel

Deseo implementar la funcionalidad Arrastrar y soltar personalizada para una subclase JPanel . Me siguiendo las directrices de la norma DnD Tutorial:

Drag and Drop and Data Transfer

En la superficie, las cosas parecen bastante strightforward, pero cuando realmente probarlo, me sale ninguna indicación de que cualquier comportamiento DnD está sucediendo. En el hecho , ninguno de los métodos en mi TransferHandler se llaman.

Por lo tanto, vamos a revisar lo que hice ...

hice mi propia clase de contenedor que se declara que se extienden JPanel:

public class DnDUnitPanel extends JPanel 
{ 
    ... 
} 

Copié el ListTransferHandler de esta demostración:

Drop Demo

renombró la clase como DndUnitTransferHandler, recortado a cabo código que es refiriéndose a JList ob jects e instaló System.out.println() statments en cada uno de los 5 métodos allí.

entonces instanciar dos instancias diferentes de DnDUnitPanel como esto:

DnDUnitPanel topPanel = new DnDUnitPanel(new GridLayout(0, 4, 6, 6), true); 
// topPanel.setDragEnabled(true); 
topPanel.setName("Top Panel"); 
topPanel.setTransferHandler(new DnDUnitTransferHandler()); 

DnDUnitPanel bottomPanel = new DnDUnitPanel(new GridLayout(0, 4, 6, 6), true); 
// bottomPanel.setDragEnabled(true); 
bottomPanel.setName("Bottom Panel"); 
bottomPanel.setTransferHandler(new DnDUnitTransferHandler()); 

(y también puedo crear algunos casos JLabel y añadir() a los paneles (no mostrados)).

Cuando intento arrastrar un JLabel de un panel a otro, no pasa nada. así que volví y volver a leer esta página:

Transfer Handler

, en particular, lo que dice acerca setDragEnabled():

turns on drag support. (The default is false.) This method is 
defined on each component that supports the drag gesture; the link 
takes you to the documentation for JList. 

JPanel no tiene un método setDragEnabled(). Entonces, me pregunté, ¿qué significa eso realmente : "componente que admite el gesto de arrastre"?

Primero pensé que esto debe significar algo que está declarado para implementar MouseListener y/o MouseMotionListener. Modifiqué DnDUnitPanel al declaro que implementa ambos y proporcionó todos los métodos. Tener hecho, pude ver que mousePressed(), mouseClicked(), mouseDragged(), etc. estaban recibiendo llamadas, pero todavía no hay nada en el TransferHandler estaba siendo llamado, y todavía no hay cursor de arrastre que indica algo fue arrastrado o está listo para ser eliminado.

Entonces miré a la fuente por sí mismo JList y decidió que "apoya la acción de arrastre" en realidad sólo significa algo que tiene un propiedad 'dragEnabled' con el getter y setter asociado.

Así, declaré la propiedad y siempre que el getter y setter en DnDUnitPanel con sólo copiar el código directamente de sí JList (pensando tal vez algo que no entiendo plenamente está llamando isDragEnabled() y en busca de un valor verdadero para iniciar el comportamiento NOM.)

Desafortunadamente, proporcionando los (y eliminando el comentario de las llamadas anteriores a DnDUnitPanel.setDragEnabled()) también tuvo ningún efecto.

Entonces ... el TransferHandler nunca se llama(). Obviamente, aquí falta algo importante, el , pero no veo qué podría ser.

Estoy en un callejón sin salida para saber qué probar a continuación.

¿Alguien puede ver lo que falta aquí?

Respuesta

11

Básicamente necesita una fuente de datos.

mirar al otro Stackoverflow question, here y here (una buena explicación de DND)

+1

Creo que lo más importante que los recién llegados a la tecnología DnD tienden a tropezar en no reconoce que tiene que proporcionar su propia MouseListener o MouseMotionListener para iniciar el arrastre (para componentes personalizados, que no proporcionan soporte de forma nativa). Encontré el [dreamincode example] (http://www.dreamincode.net/forums/topic/209966-java-drag-and-drop-tutorial-part-1-basics-of-dragging/) como el más útil . Gracias, @Xeon por tu respuesta. – user1441004

+0

ese último enlace es 404'd –

+0

@ChrisDrappier Acabo de actualizarlo – Xeon