0
我有兩個節點。我想單擊一個節點,將光標拖到另一個節點,並在光標釋放後用線連接兩個節點。JavaFx通過拖放連接兩個子節點與一條線
我已經設置了所有的EventHandlers - 拖放行作品,但它不綁定到第二個節點。
public class LinkHandler {
static Node hoverNode;
}
該類用於查找光標懸停在哪個節點上。
private void setLinkHandlers(Node node) {
Line line = new Line();
this.getChildren().add(line);
// On mouse hover, set LinkHandler.hoverNode
node.setOnMouseDragEntered((MouseEvent mouseEvent) -> {
LinkHandler.setHoverNode(node);
System.out.println(node);
});
// On mouse exit, remove LinkHandler.hoverNode
node.setOnMouseDragExited((MouseEvent mouseEvent) -> {
// PLEASE NOTE: I have tried commenting and uncommenting the line below. Neither works.
// LinkHandler.setHoverNode(null);
});
// On mouse press, set Line startpoint
node.setOnMousePressed((MouseEvent mouseEvent) -> {
// Stop BorderPane from being dragged
LinkHandler.isConnecting = true;
// Bind startpoint to node position
line.startXProperty().bind(node.layoutXProperty());
line.startYProperty().bind(node.layoutYProperty());
});
// On mouse released, either bind Line to LinkHandler.hoverNode, or remove if hoverNode = null
node.setOnMouseReleased((MouseEvent mouseEvent) -> {
// Allow BorderPane to be dragged again
LinkHandler.isConnecting = false;
// If there is a node to connect to...
if(LinkHandler.getHoverNode() != null) {
// Bind end position to the node's position
line.endXProperty().bind(LinkHandler.getHoverNode().layoutXProperty());
line.endYProperty().bind(LinkHandler.getHoverNode().layoutYProperty());
} else {
// Otherwise print error
System.out.println("Not hovering over a node. Cannot create connection.");
}
});
// Temporarily bind Line endpoint to mouse position.
node.setOnMouseDragged((MouseEvent mouseEvent) -> {
line.setEndX(mouseEvent.getX());
line.setEndY(mouseEvent.getY());
});
}
這是一個很大的代碼,所以我會試着總結一下吧:
- 當dragEntered,設置LinkHandler.hoverNode此節點
- 當dragExit,設置LinkHandler.hoverNode到空
- 的mousePressed時,結合線開始位置到該節點的位置
- 當的mouseDragged,臨時設置線端部位置到mousePosition
- 當mouseReleased時,將行結束位置綁定到LinkerHandler.hoverNode位置,或者刪除Line is hoverNode爲null。
我認爲問題就出在這個片段:
// On mouse hover, set LinkHandler.hoverNode
node.setOnMouseDragEntered((MouseEvent mouseEvent) -> {
LinkHandler.setHoverNode(node);
System.out.println(node);
});
// On mouse exit, remove LinkHandler.hoverNode
node.setOnMouseDragExited((MouseEvent mouseEvent) -> {
// LinkHandler.setHoverNode(null);
});
我不認爲這是正確的得到所謂的。此代碼適用的節點是BorderPane的子節點,它具有它自己的onMouseDrag功能< <這可能也會導致問題。
在此先感謝,對不起,如果這個問題有點含糊。我試圖具體。
我在'startFullDrag adeded()'命令,它仍然不會對工作一些原因。 'setOnMouseDragEntered'永遠不會觸發。 – user3668541