2017-09-12 9 views
1

私はJavaFXを初めて使用しているので、TornadoFXにも慣れていますので、私にご負担ください。TornadoFXツリービューでのドラッグアンドドロップ

私は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; 
     }; 
    }); 

:JavaでTreeViewは、そのsetCellFactory呼び出しで次のような実装を持っています。すでに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'メソッドは、(' call'メソッドを使って)Callbackオブジェクトを受け取ります。それはあなたがここに持っているものにどのように変換されますか? – melston

+0

@melston SAM変換(SAM = Single Abstract Method)と呼ばれています。より多くの情報はここにあります:https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions –

+0

@ RuckusT-Boom、私がSAMコンストラクタについて見たすべての記述から、私はその例を考えていただろうオブジェクト:コールバック{...} ' – melston

関連する問題