2016-09-21 91 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; } 
}