2016-09-21 57 views
0

我想拖动一些自定义节点。这些节点添加为孩子的AnchorPane,如根FXML的控制器定义: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我想出了解决我的问题的办法。 我的错误是不理解,父母扩展节点 - 我曾假设我需要引用别的东西。

为了实现我想要的拖动功能,我创建了一个具有Node输入变量的函数(谢谢@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; } 
}