2017-09-12 3 views
1

저는 JavaFX를 처음 사용하고 있으므로 TornadoFX에도 익숙하지 않으므로 부담하십시오.TornadoFX TreeView에서 드래그 앤 드롭

Java에서 간단한 응용 프로그램을 가지고 있지만이를 Kotlin으로 옮기고 TornadoFX에서 해당 메커니즘을 찾는 데 문제가 있습니다. 이야기 및 챕터를 나타내는 IStoryItem의 구현을 보유하고있는 ListView이 있습니다. 나는 챕터를 한 이야기에서 다른 이야기로 옮길 수 있기를 원한다. 내가 TornadoFX 비슷한 뭔가를 보았다하지만 그것이 작동하는 것처럼 보이는 아무것도 찾을 수 없습니다

tv.setCellFactory(new Callback<TreeView<IStoryItem>, TreeCell<IStoryItem>>() { 
     @Override 
     public TreeCell<IStoryItem> call(TreeView<IStoryItem> siTreeView) { 
      TreeCell<IStoryItem> cell = new TreeCellStoryEditor(); 

      cell.setOnDragDetected((MouseEvent event) -> { 
       // Don't drag Story nodes. 
       if (cell.getItem() instanceof Story) return; 

       Dragboard db = cell.startDragAndDrop(TransferMode.MOVE); 

       // Put the Part on the dragboard 
       // From: https://stackoverflow.com/a/30916660/780350 
       ClipboardContent content = new ClipboardContent(); 
       content.put(objectDataFormat, cell.getItem()); 
       db.setContent(content); 

       event.consume(); 
      }); 

      cell.setOnDragOver((DragEvent event) -> { 
       if (event.getGestureSource() != cell && event.getDragboard().hasContent(objectDataFormat)) { 
        /* allow for moving */ 
        event.acceptTransferModes(TransferMode.MOVE); 
       } 

       event.consume(); 
      }); 

      cell.setOnDragEntered((DragEvent event) -> { 
       IStoryItem item = cell.getItem(); 
       if (item instanceof Story && 
         event.getGestureSource() != cell && 
         event.getDragboard().hasContent(objectDataFormat)) { 
        cell.setUnderline(true); 
       } 

       event.consume(); 
      }); 

      cell.setOnDragExited((DragEvent event) -> { 
       cell.setUnderline(false); 
       event.consume(); 
      }); 

      cell.setOnDragDropped((DragEvent event) -> { 
       try { 
        Dragboard db = event.getDragboard(); 
        boolean success = false; 
        if (db.hasContent(objectDataFormat)) { 
         Part droppedPart = (Part)db.getContent(objectDataFormat); 
         IStoryItem targetStoryItem = cell.getItem(); 

         // Question: How to handle drops between leaf items or 
         // before the initial leaf or after the final leaf. 
         if (targetStoryItem instanceof Story) { 
          Story story = (Story) targetStoryItem; 

          updateStoryWith(droppedPart, story); 
          addPartTo(cell.getTreeItem(), droppedPart); 
          success = true; 
         } 
        } 

        event.setDropCompleted(success); 
        event.consume(); 
       } catch (Exception e) { 
        System.out.println(e.getMessage()); 
       } 
      }); 

      cell.setOnDragDone((DragEvent event) -> { 
       if (event.getTransferMode() == TransferMode.MOVE) { 
        IStoryItem item = cell.getItem(); 
        TreeItem<IStoryItem> ti = cell.getTreeItem(); 
        TreeItem<IStoryItem> pti = ti.getParent(); 
        pti.getChildren().remove(ti); 

        IStoryItem psi = pti.getValue(); 
        // Remove the Part/Chapter from its previous Story 
        boolean removed = removePartFrom(psi, item); 
       } 
       event.consume(); 
      }); 

      cell.setEditable(true); 

      return cell; 
     }; 
    }); 

: 자바의 TreeViewsetCellFactory 호출에서 다음과 같은 구현을 가지고 있습니다. 이미 cellFormat 빌더를 사용하고 있지만 내부에 이벤트 핸들러를 추가하는 방법을 알 수 없습니다. IntelliJ의 인텔리 센스에서 볼 때 cellFactory 빌더가 있지만 사용 방법이나 이벤트 핸들러를 추가하는 방법을 잘 모르겠습니다.

답변

2

TornadoFX에서 똑같은 기술을 사용할 수 있습니다. TornadoFX는 JavaFX 상단에 고급 API를 적용합니다. 문제없이 기본 JavaFX API에 항상 액세스 할 수 있습니다.

tv.setCellFactory { 
    object : TreeCell<IStoryItem>() { 
     init { 
      setOnDragOver { event -> 

      } 
      setOnDragEntered { event -> 

      } 
      setOnDragExited { event -> 

      } 
      setOnDragDropped { event -> 

      } 
     } 
    } 
} 
+0

이것은 이상한 구문입니다. 'setCellFactory' 메쏘드는 Callback 객체를 취합니다 ('call' 메쏘드 사용). 그것은 당신이 여기있는 것과 어떻게 번역됩니까? – melston

+0

@melston SAM 변환 (SAM = Single Abstract Method)이라고합니다. 자세한 내용은 여기를 참조하십시오. https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions –

+0

@ RuckusT-Boom, SAM 생성자에 대한 모든 설명에서 예를 들어 보았을 것입니다. 'object : Callback {...}'이었을 것입니다. – melston