2017-02-25 8 views
0

私は単一のフローパネルの中にいくつかのボタンを含むjavafxアプリケーションを持っています。ボタンをドラッグ可能にするために、私は各ボタンを個々のペインの中に入れました。ユーザーはいずれかのペインから任意のボタンを選択し、&を他のペインにドロップすることができます。たとえば、ペイン1からボタンを取得し、ドラッグしてペイン5の中にドロップします。JavaFXボタンを1つのペインから別のペインにドラッグ

ユーザが選択するボタンは以前は分かっていなかったので、まず何かをドラッグボードに追加する必要があると思いますそれはsetOnDragDropped操作でドラッグボードから取得できます。

私が使用してimageviewsの間に画像をドラッグ&ドロップすることができています:のみ、

Dragboard db = iv_1.startDragAndDrop(TransferMode.MOVE); 
    ClipboardContent content = new ClipboardContent(); 
    content.putImage(iv_1.getImage()); 

をしかし、インクルードが使用可能な特定のオプションではないので、私は、dragboardにボタンを追加する方法を把握することはできませんcontent.putText、またはcontent.putString()のように適用されないオプション...

助けていただければ幸いです。これは私がこれまで持っているものです。

private void btn_1_setOnDragDetected(MouseEvent event) { 

    Dragboard db = btn_1.startDragAndDrop(TransferMode.MOVE); 
    ClipboardContent content = new ClipboardContent(); 
    // below seems to be wrong 
    content.put(dataFormat,btn_1.toString()); 
    db.setContent(content); 

    event.consume(); 
} 


private void btn_1_setOnDragOver(DragEvent event) { 

    if (event.getGestureSource() != btn_1 && 
      event.getDragboard().hasString()) { 
     event.acceptTransferModes(TransferMode.MOVE); 
    } 
    event.consume(); 
} 


private void pane_5_setOnDragDropped(DragEvent event) { 

    Dragboard db = event.getDragboard(); 
    boolean success = false; 
    if (db.hasString()) { 
     // below must be wrong 
     pane_5.setId(db.getString()); 
     success = true; 
    } 
    event.setDropCompleted(success); 
    event.consume(); 
    } 
+0

ジャストアイデアを投げます。重要な詳細をボタンにコピーして、その場所でドラッグ・リリースの新しいボタンを作成できますか?次に、ボタンの機能を決定するために詳細を使用しましたか? – Sedrick

+0

'setId'はボタンをペインに追加しません。 java [documentation](https://docs.oracle.com/javase/8/javafx/api/javafx/scene/Node.html#getId--)を参照してください。 – theKidOfArcrania

+0

['startFullDrag'](https://docs.oracle.com/javase/8/javafx/api/javafx/scene/Node.html#startFullDrag--)+ [' MouseDragEvent.getGestureSource']を使用します(https:///docs.oracle.com/javase/8/javafx/api/javafx/scene/input/MouseDragEvent.html#getGestureSource--)。そして、btwはそのアイデアを 'Dragboard'で投げ捨てます。あなたのアプリケーションのどこかで 'Button'をドラッグするのは意味がありませんが、' Dragboard'はソースアプリケーションに依存しないデータをドラッグするために使われます。 – fabian

答えて

2

(すなわちdragboardに)クリップボードの内容にボタンを追加する方法はありません。特定の型(文字列、イメージ)と、シリアライズ可能(ボタンはありません)を実装するオブジェクトだけを追加することができます。ドラッグアンドドロップAPIは、この側面では非常に不足しています。ドラッグボードにダミーのテキストを追加して、現在ドラッグされているボタンへの参照を保持するだけです。

クイックSSCCE:

import javafx.application.Application; 
import javafx.geometry.Orientation; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.SplitPane; 
import javafx.scene.input.ClipboardContent; 
import javafx.scene.input.DataFormat; 
import javafx.scene.input.Dragboard; 
import javafx.scene.input.TransferMode; 
import javafx.scene.layout.FlowPane; 
import javafx.scene.layout.Pane; 
import javafx.stage.Stage; 

public class DragAndDropButton extends Application { 

    private final DataFormat buttonFormat = new DataFormat("com.example.myapp.formats.button"); 

    private Button draggingButton ; 

    @Override 
    public void start(Stage primaryStage) { 
     FlowPane pane1 = new FlowPane(); 
     FlowPane pane2 = new FlowPane(); 

     for (int i = 1 ; i <= 10; i++) { 
      pane1.getChildren().add(createButton("Button "+i)); 
     } 

     addDropHandling(pane1); 
     addDropHandling(pane2); 

     SplitPane splitPane = new SplitPane(pane1, pane2); 
     splitPane.setOrientation(Orientation.VERTICAL); 

     Scene scene = new Scene(splitPane, 600, 600); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    private Button createButton(String text) { 
     Button button = new Button(text); 
     button.setOnDragDetected(e -> { 
      Dragboard db = button.startDragAndDrop(TransferMode.MOVE); 
      db.setDragView(button.snapshot(null, null)); 
      ClipboardContent cc = new ClipboardContent(); 
      cc.put(buttonFormat, "button"); 
      db.setContent(cc); 
      draggingButton = button ; 
     }); 
     button.setOnDragDone(e -> draggingButton = null); 
     return button ; 
    } 

    private void addDropHandling(Pane pane) { 
     pane.setOnDragOver(e -> { 
      Dragboard db = e.getDragboard(); 
      if (db.hasContent(buttonFormat) 
        && draggingButton != null 
        && draggingButton.getParent() != pane) { 
       e.acceptTransferModes(TransferMode.MOVE); 
      } 
     }); 

     pane.setOnDragDropped(e -> { 
      Dragboard db = e.getDragboard(); 
      if (db.hasContent(buttonFormat)) { 
       ((Pane)draggingButton.getParent()).getChildren().remove(draggingButton); 
       pane.getChildren().add(draggingButton); 
       e.setDropCompleted(true); 
      }   
     }); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

ありがとう.... – rainer

関連する問題