2011-07-26 16 views
7

Necesito hacer sólo hojas de un JTree que pueden arrastrarse, pero los siguientes fragmentos de código hace que cada nodo en el árbol pueda arrastrar:JTree hacen sólo deja que pueden arrastrarse

tree.setDragEnabled(true); 

¿Cómo puedo restringir el elemento arrastrable a informationen específica de una nodo de árbol como la propiedad myNode.isLeaf();

tia jaster

Respuesta

5

Esto se puede hacer cambiando el TransferHandler de la JTree para devolver un nulo Transferable en los nodos no hojas.

Aquí está un ejemplo rápido:

JTree tree = new JTree(); 
    tree.setDragEnabled(true); 
    tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); 

    tree.setTransferHandler(new TransferHandler(null) { 
     public int getSourceActions(JComponent c) { 
      return MOVE; 
     } 

     protected Transferable createTransferable(JComponent c) { 
      JTree tree = (JTree) c; 
      DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getSelectionPath().getLastPathComponent(); 

      if (node.isLeaf()) { 
       // TODO create the Transferable instance for the selected leaf 
      } else { 
       return null; 
      } 
     } 
    }); 
+0

que es probablemente la única manera, a un cuidado: todo comportamiento arrastrando por defecto se pierde cuando se instala un controlador personalizado. Lo más sensato sería delegar todas las operaciones al controlador predeterminado y solo interceptar la creación transferible, lo que lamentablemente no fue posible la última vez que miré (algunas partes importantes de BasicTransferHandler son paquetes privados o protegidos, se olvidó cuál exactamente) – kleopatra

+0

Thx , funciona según lo previsto. – jaster

Cuestiones relacionadas