2011-05-24 13 views
5

Tengo un JTree donde los usuarios pueden soltar elementos de otros componentes. Cuando los usuarios se desplazan sobre los nodos en el árbol (durante el "modo de caída"), se resalta el nodo que está más cerca. Esto se logra en la implementación de TransferHandler.¿Hay alguna manera de detectar si una gota está por ocurrir en un JTree?

@Override 
public boolean canImport(TransferSupport support) { 

    //Highlight the most near lying node in the tree as the user drags the 
    //mouse over nodes in the tree. 
    support.setShowDropLocation(true); 

Cada vez que se selecciona un nuevo nodo (también durante el "modo de caída"), este se iniciará de un TreeSelectionEvent. Esto, a su vez, invocará un oyente que he creado que consultará una base de datos para obtener detalles relacionados con ese nodo.

Ahora, estoy buscando una manera de filtrar de alguna manera los eventos que se generan a partir de las selecciones de nodos durante el "modo de caída". Es un intento de limitar las llamadas a la base de datos. ¿Alguien tiene alguna idea sobre cómo puedo lograr esto?

¡Toda la entrada será muy apreciada!

Respuesta

1

Hay un método muy indirecto para detectar este caso. Puede registrar PropertyChangeListener en la propiedad "dropLocation" con el componente árbol. Se llamará a esto cada vez que cambie la ubicación de la caída y, por lo tanto, puede establecer un campo dropOn que luego puede leer en el TreeSelectionListener.

tree.addPropertyChangeListener("dropLocation", new PropertyChangeListener() { 
    public void propertyChange(PropertyChangeEvent pce) { 
     dropOn = pce.getNewValue() != null; 
    } 
}); 

tree.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() { 
    public void valueChanged(TreeSelectionEvent tse) { 
     System.out.println(tse + " dropOn=" + dropOn); 
    } 
}); 

en cuenta que esto disparar un valor incorrecto false por primera vez que entra en el árbol, pero todos los eventos posteriores a continuación, mostrar dropOn = true.

+0

No he intentado esto, pero ¿sería esto lo mismo que hacer Tree.getDropLocation()? He experimentado con eso, pero por alguna razón no funcionó realmente ... – sbrattla

+0

@sbrattla, por supuesto, tienes razón y esta es una solución mucho más simple. Estaba pensando demasiado complicado ... Sin embargo, ¿por qué 'getDropLocation' no funciona en su caso? En mi opinión, hace lo que quieres. – Howard

+0

Bueno, probablemente necesite echarle un vistazo nuevamente y ver si puedo hacer que funcione correctamente. No puedo poner mi dedo en nada (con respecto a por qué no funcionó) ... lo más probable es que sea una cuestión de sentarse y pasar el tiempo que realmente toma resolverlo. De cualquier forma, gracias por tu aporte. Al menos confirmaste que estoy en el camino correcto, ¡así que marcaré tu respuesta como correcta! – sbrattla

Cuestiones relacionadas