2012-11-29 6 views
7

私はJavaFx 2.2でアプリケーションを構築しています。これは、左側にコンポーネントパネル、右側に作業シートを持つ分割ペインで構成されています。基本的には、左から右にコンポーネントをドラッグして、右側に配置するシンプルなエディタです。シーンビルダのようなドラッグアンドドロップを実装する

私は運がなくて、SceneBuilderを持って同じドラッグアンドドロップ機能を実装しようとする日の最後のカップルを費やしてきた

...

http://docs.oracle.com/javafx/2/drag_drop/HelloDragAndDrop.java.htmlでのサンプル後、私はdrag-を得ることができましたあなたがドラッグしているときに表示されるデフォルトのファイルアイコンを変更する(そしてドラッグしているコンポーネントのスナップショットで置き換える)方法や、何かの上にあるときに禁止アイコンを表示する方法を見つけることができませんあなたは落ちることはできません。

すべてのヘルプは(他のアドバイス、コードスニペット、サンプルまたは可能性)をいただければ幸いです:)

感謝を!

答えて

16

[UPDATE]

が最後にそれを自分で管理:

/* The 'sceneRoot' object is the root Node of the scene graph 
* stage.setScene(new Scene(sceneRoot, 1280, 1024)); 
*/ 

private ImageView dragImageView = new ImageView(); 
private Node dragItem; 

_

rightPane.setOnMouseDragEntered(new EventHandler<MouseDragEvent>() { 
    public void handle(MouseDragEvent e) { 
     rightPane.setStyle("-fx-border-color:red;-fx-border-width:2;-fx-border-style:solid;"); 
     e.consume(); 
    } 
}); 
rightPane.setOnMouseDragExited(new EventHandler<MouseDragEvent>() { 
    public void handle(MouseDragEvent e) { 
     rightPane.setStyle("-fx-border-style:none;"); 
     e.consume(); 
    } 
}); 
rightPane.setOnMouseDragReleased(new EventHandler<MouseDragEvent>() { 
    public void handle(MouseDragEvent e) { 
     //TODO: add new instance of dragItem to rightPane 
     e.consume(); 
    } 
}); 

_たぶん後半

private void addGesture(final Node node) { 
    node.setOnDragDetected(new EventHandler<MouseEvent>() { 
     public void handle(MouseEvent e) { 

      SnapshotParameters snapParams = new SnapshotParameters(); 
      snapParams.setFill(Color.TRANSPARENT); 
      dragImageView.setImage(node.snapshot(snapParams, null)); 

      sceneRoot.getChildren().add(dragImageView); 

      dragImageView.startFullDrag(); 
      e.consume(); 
     } 
    }); 
    node.setOnMouseDragged(new EventHandler<MouseEvent>() { 
     public void handle(MouseEvent e) { 
      Point2D localPoint = sceneRoot.sceneToLocal(new Point2D(e.getSceneX(), e.getSceneY())); 
      dragImageView.relocate(
        (int)(localPoint.getX() - dragImageView.getBoundsInLocal().getWidth()/2), 
        (int)(localPoint.getY() - dragImageView.getBoundsInLocal().getHeight()/2) 
      ); 
      e.consume(); 
     } 
    }); 
    node.setOnMouseEntered(new EventHandler<MouseEvent>() { 
     public void handle(MouseEvent e) { 
      node.setCursor(Cursor.HAND); 
     } 
    }); 
    node.setOnMousePressed(new EventHandler<MouseEvent>() { 
     public void handle(MouseEvent e) { 
      dragItem = node; 
      dragImageView.setMouseTransparent(true); 
      node.setMouseTransparent(true); 
      node.setCursor(Cursor.CLOSED_HAND); 
     } 
    }); 
    node.setOnMouseReleased(new EventHandler<MouseEvent>() { 
     public void handle(MouseEvent e) { 
      dragItem = null; 
      dragImageView.setMouseTransparent(false); 
      node.setMouseTransparent(false); 
      node.setCursor(Cursor.DEFAULT); 
      sceneRoot.getChildren().remove(dragImageView); 
     } 
    }); 

} 
+1

いい仕事です。 [ドラッグビュー機能](http://javafx-jira.kenai.com/browse/RT-14730?focusedCommentId=317064#)は将来のリリースでjdk8のようにJavaFXプラットフォームに追加される予定です。 – jewelsea

+0

ListViewのソリューションを再実装しようとしましたが、わかりません。setOnDragDetectedハンドラのシーン変数はどのような型ですか。シーンにはgetChildern()メソッドがないので、これはシーンではありません。 – andreas

+0

「シーン」オブジェクトは実際にシーングラフのルートノードです。コメントを付けてコードを更新し、理解を深めるためにsceneRootでシーンの名前を変更しました。それを強調してくれてありがとう;) – Badisi

2

、 setDragViewオプションを使用すると、今のところもっとよくなります:)

// Cursor Display for Drag&Drop 
source.setOnMouseEntered(e -> source.setCursor(Cursor.OPEN_HAND)); 
source.setOnMousePressed(e -> source.setCursor(Cursor.CLOSED_HAND)); 
source.setOnMouseReleased(e -> source.setCursor(Cursor.DEFAULT)); 

// Manage drag 
source.setOnDragDetected(event -> { 
    /* drag was detected, start a drag-and-drop gesture*/ 
    Dragboard db = source.startDragAndDrop(TransferMode.MOVE); 

    // Visual during drag 
    SnapshotParameters snapshotParameters = new SnapshotParameters(); 
    snapshotParameters.setFill(Color.TRANSPARENT); 
    db.setDragView(source.snapshot(snapshotParameters, null)); 

    /* Put a string on a dragboard */ 
    ClipboardContent content = new ClipboardContent(); 
    content.putString(source.getText()); 
    db.setContent(content); 

    event.consume(); 
}); 
関連する問題