2016-05-15 24 views
0

非常に単純なインターフェイスを開発するために、Scene Builderと一緒にFXMLを使用しています。以下、最初のイメージはレイアウト階層を表します。 2番目の画像は、ボタンが押されたときにテキスト領域を表示します。JavaFXシーンビルダ - 親ノード間のドラッグアンドドロップ

アクションイベントメソッドは、新しいテキスト領域をインスタンス化し、それを最初のフローペイン(左から右)に割り当てます。私の目標は、各テキスト領域を他のフローペインのいずれかにドラッグアンドドロップすることです。

私の最初の試みはMOUSE_PRESSEDを検出するためのイベントハンドラを使用して割り当てを使用していた:textArea.addEventHandler(MouseEvent.DRAG_DETECTED, e-> handle(e));

私はハンドル方法を設定するに着いたとき、物事が混乱しました。たとえば、MOUSE_EXITED_TARGET、MOUSE_ENTERED_TARGETなど、他のさまざまなMouseEventを含める必要がありますか?そして、MOUSE_RELEASEDハンドルはどのように構成されていますか?

私はDragboardとClipboardを見始めましたが、そこにも多くの運が見つかりませんでした。クリップボードは文字列の値を扱うことができるように見えました。私は、私の苦境への簡単な答えがあると確信しています。それは、私が未知の領域で不思議に思っていることをはっきりと示しているからです。

私はいくつかの "教科書"リソースを読みましたが、実行時に構築されたオブジェクトの動きにすべて対応しており、ほとんどは一般的または直接的な例のように見えます。

注記 私はイメージを謝罪します。私はそれがはっきりしていないことを認識しています。グリッドペインには5つのフローペインが配置されています。私はすぐにそれを編集し、更新しようとします。

initial interface hierarchy after button is pressed

答えて

1

だから私はドラッグと異なるFlowPanesTextAreasをドロップしようとしている理解しています。 ではなく、DragEventsを使用してこれを実現できます。ここでは例です:唯一のアカウントにTextAreaと2 FlowPanesを取って、あなたのようなシンプルなレイアウトを考慮

、我々は次のフィールドを持っていると思います:開始時

@FXML 
private TextArea textArea; 

@FXML 
private FlowPane flowPane1; 

@FXML 
private FlowPane flowPane2; 

textAreaflowPane1上に配置され、 GridLayoutの左側にあります。

TextArea on left grid

我々は右flowPaneに'textArea'をドラッグ&ドロップしたいと思います。まず、textAreaにドラッグ可能にする必要があります。この場合、動く。さまざまな方法で実装することができますが、ここでは、既存のTextAreaをもう1つのFlowPaneに移動する方法を示します。もう1つの方法は、テキストを1つ作成するだけです。

textArea.setOnDragDetected((MouseEvent event) -> { 
    //We want the textArea to be dragged. Could also be copied. 
    Dragboard db = textArea.startDragAndDrop(TransferMode.MOVE); 

    // Put a string on a dragboard as an identifier 
    ClipboardContent content = new ClipboardContent(); 
    content.putString(textArea.getId()); 
    db.setContent(content); 

    //Consume the event 
    event.consume(); 
}); 

その後、我々はそれがドラッグされていたときにtextAreaを受け入れるようにflowPane2をしたいと思います。最初に、ドラッグしているときにtextAreaを受け入れるように指示します。

flowPane2.addEventHandler(DragEvent.DRAG_OVER, (DragEvent event) -> { 
    if (event.getGestureSource() != flowPane2 
      && event.getDragboard().hasString()) { 
     event.acceptTransferModes(TransferMode.COPY_OR_MOVE); 
    } 
    event.consume(); 
}); 

これをドラッグすることができたら、実際に何かを行い、落としたときに受け入れるようにします。そこで、ドロップされたtextAreaを受け入れる別のハンドラを追加します。

flowPane2.addEventHandler(DragEvent.DRAG_DROPPED, (DragEvent event) -> { 
    //Get the dragboard back 
    Dragboard db = event.getDragboard(); 
    boolean success = false; 
    //Could have some more thorough checks of course. 
    if (db.hasString()) { 
     //Get the textarea and place it into flowPane2 instead 
     flowPane2.getChildren().add(textArea); 
     success = true; 
    } 
    //Complete and consume the event. 
    event.setDropCompleted(success); 
    event.consume(); 
}); 

結果、textAreaflowPane2flowPane1から移動させることができます。逆もありませんが、これはあなたに行くでしょう!

Dragged textArea

+0

私はあなたの応答を読んだ後、このくらいの明確な理解を持っていると思うので、あなたに感謝!メソッド/イベントハンドラをどこに配置する必要があるのか​​説明できますか? – wellington

+0

これはおそらく、それらの作成場所によって異なります。 buttonを使用してtextAreaを作成するので、おそらくeventHandlerを接続することができます。この例では、 'Controller'で' Initializable'によって継承された 'initialize(URL、ResourceBundle)'を使用しました。だから、初期化時に配線されています。 – Jaims

関連する問題