2012-06-28 22 views
6

Actualmente estoy trabajando con un TreeView de JavaFx-2 que representa un sistema de archivos.¿Arrastrar y soltar es compatible con TreeItem?

Quiero habilitar drag and drop para permitir las operaciones de movimiento, pero parece que TreeItem no incluye los eventos de arrastrar oyentes. Solo pude implementar arrastrar y soltar en el objeto TreeView englobado, pero no funciona para los subelementos.

¿Me falta algo o aún no se soportan eventos de arrastrar y soltar para TreeItems?

Respuesta

5

pregunta respondida por Csh en los foros de Oracle: https://forums.oracle.com/forums/message.jspa?messageID=10426066#10426066

Usted tiene que poner en práctica lastre para el descenso en la TreeCell.

Escribe un CellFactory así:

TreeView<String> treeView = new TreeView<String>(); 
    treeView.setCellFactory(new Callback<TreeView<String>, TreeCell<String>>() { 
     @Override 
     public TreeCell<String> call(TreeView<String> stringTreeView) { 
      TreeCell<String> treeCell = new TreeCell<String>() { 
       protected void updateItem(String item, boolean empty) { 
        super.updateItem(item, empty); 
        if (item != null) { 
         setText(item); 
        } 
       } 
      }; 

      treeCell.setOnDragDetected(new EventHandler<MouseEvent>() { 
       @Override 
       public void handle(MouseEvent mouseEvent) { 

       } 
      }); 

      return treeCell; 
     } 
    }); 

Si él quiere reivindicar su reputación o añadir información a su solución, voy a cambiar esta respuesta.

+2

¿alguna vez escribir hasta cómo se ha implementado? Me encantaría ver algún código funcional. ¡aclamaciones! –

+0

Arrastrar y colocar como texto es una solución muy pobre. Mis nodos son objetos complejos de Java, representados como texto. – Aubin

2

La respuesta por @Timst es correcta, pero debe cambiar el método "updateItem" porque en el caso anterior no podrá establecer el Gráfico del "TreeItem" y el colapso del árbol no funcionará correctamente (won borre el texto en subnodos).

acaba de cambiar el método a:

@Override 
protected void updateItem(String item, boolean empty) { 
    super.updateItem(item, empty); 
    if (!empty && item != null) { 
     setText(item); 
     setGraphic(getTreeItem().getGraphic()); 
    }else{ 
     setText(null); 
     setGraphic(null); 
    } 
}