2016-09-21 5 views
0

カスタムノードをドラッグしようとしています。これらのノードは、ルートFXMLのコントローラで定義されているように、AnchorPaneに子として追加されます。JavaFxは、ノードまたはメインのFXMLコントローラからノードをドラッグすることを処理しますか?

package sample; 

import ... 

public class Controller { 
    @FXML 
    AnchorPane anchorPane; 

    public void add() { 
     try { 
      // Node.fxml is the custom node object 
      Parent root = FXMLLoader.load(getClass().getResource("Node.fxml")); 
      anchorPane.getChildren().add(root); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

は、私は私のノードがルートFXMLコントローラ内またはドラッグ可能ノード自体のFXMLコントローラ内のドラッグ扱うべきでしょうか?

ルートFXMLコントローラ内で実行する必要がある場合は、どうすればよいですか? FXMLLoader.Load()を呼び出すと、FXMLファイルを参照するだけで、マウスイベントをアタッチできなくなります。

私はJavaとJavaFxの新機能ですから、何かが役に立ちます。 (ただし、プログラミングの初心者ではありません)。

ありがとうございます。

+1

を 'FXMLLoader.load()' 'Node'を返します。なぜあなたはそれにイベントハンドラを添付できませんか? – fabian

+1

@fabianはここに何かあると思います。関連するドラッグイベントリスナーをノードに引数として取り込むメソッドを作成します。私はそれが滑らかな解決策かもしれないと思う。 – Gikkman

+0

@fabianああ、私はそれを認識していない!私はドキュメントをチェックしたが、ParentがNodeを拡張していることに気付かなかった。ありがとうございました! – user3668541

答えて

0

@ fabianと@Gikkmanのおかげで、私は私の問題を解決しました。 私のエラーは、ParentがNodeを拡張することを理解していない - 私は何か他のものを参照する必要があると仮定していた。

私が望むドラッグ機能を実装するために、Node入力変数(thanks @Gikkman)を持つ関数を作成しました。このNodeオブジェクトには、イベントハンドラをアタッチすることができます。 ParentはNode(これは私が気付いていない)を拡張しているので、簡単に入力としてFXMLLoader.Load()を使用できます。

は、だから私は、その後持っている:

package sample; 

import ... 

import java.io.IOException; 

public class Controller { 
    @FXML 
    AnchorPane anchorPane; 

    public void add() { 
     try { 
      // Node.fxml is the custom node object 
      Parent root = FXMLLoader.load(getClass().getResource("Node.fxml")); 
      // Sets the EventHandlers for dragging 
      dragNode(root); 
      // Adds the node to the scene 
      anchorPane.getChildren().add(root); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    // Handles all dragging EventHandlers for any node object 
    public void dragNode(Node node) { 
     // Custom object to hold x and y positions 
     final Delta dragDelta = new Delta(); 

     node.setOnMousePressed(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent mouseEvent) { 
       dragDelta.x = node.getLayoutX() - mouseEvent.getSceneX(); 
       dragDelta.y = node.getLayoutY() - mouseEvent.getSceneY(); 
      } 
     }); 

     node.setOnMouseReleased(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent mouseEvent) { 
       node.setCursor(Cursor.HAND); 
      } 
     }); 

     node.setOnMouseDragged(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent mouseEvent) { 
       node.setLayoutX(mouseEvent.getSceneX() + dragDelta.x); 
       node.setLayoutY(mouseEvent.getSceneY() + dragDelta.y); 
      } 
     }); 

     node.setOnMouseEntered(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent event) { 
       node.setCursor(Cursor.HAND); 
      } 
     }); 
    } 

    class Delta { double x, y; } 
} 
関連する問題