gpt4 book ai didi

java - 如何用一条线连接两个节点

转载 作者:行者123 更新时间:2023-12-02 12:28:15 25 4
gpt4 key购买 nike

如何将第一个容器中的节点连接到第二个容器中的另一个节点,即,如果我有一个 Pane ,其中有一个子节点,我如何将它连接到另一个 Pane 子节点,我已经仅管理连接同一容器的节点,但这不是我需要的,我想要这样的东西。

enter code here
public class Main extends Application {

static Pane root = new Pane();


@Override
public void start(Stage primaryStage) throws Exception{

Circuit c1 = new Circuit(10,10);
Circuit c2 = new Circuit(200,10);
Circuit c3 = new Circuit(10,200);
Circuit c4 = new Circuit(200,200);

root.getChildren().addAll(c1, c2, c3, c4);

primaryStage.setScene(new Scene(root, 300, 275));
primaryStage.show();
}


public static void main(String[] args) {
launch(args);
}
}

电路类

enter code here

import static sample.Main.root;

public class Circuit extends Pane{

Circuit(int LOCATION_X, int LOCATION_Y){
setStyle("-fx-background-color: red");
setPrefSize(150,150);

setLayoutX(LOCATION_X);
setLayoutY(LOCATION_Y);

createCircle cir = new createCircle();

cir.setLayoutX(75);
cir.setLayoutY(75);

// register handlers
cir.setOnDragDetected(startHandler);
cir.setOnMouseDragReleased(dragReleaseHandler);
cir.setOnMouseDragEntered(dragEnteredHandler);

// add info allowing to identify this node as drag source/target
cir.setUserData(Boolean.TRUE);

getChildren().add(cir);



root.setOnMouseReleased(evt -> {
// mouse released outside of a target -> remove line
root.getChildren().remove(startHandler.line);
startHandler.line = null;
});
root.setOnMouseDragged(evt -> {
if (startHandler.line != null) {
Node pickResult = evt.getPickResult().getIntersectedNode();
if (pickResult == null || pickResult.getUserData() != Boolean.TRUE) {
// mouse outside of target -> set line end to mouse position
startHandler.line.setEndX(evt.getX());
startHandler.line.setEndY(evt.getY());
}
}
});
}

class DragStartHandler implements EventHandler<MouseEvent> {

public Line line;

@Override
public void handle(MouseEvent event) {
if (line == null) {
Node sourceNode = (Node) event.getSource();
line = new Line();
Bounds bounds = sourceNode.getBoundsInParent();

// start line at center of node
line.setStartX((bounds.getMinX() + bounds.getMaxX()) / 2);
line.setStartY((bounds.getMinY() + bounds.getMaxY()) / 2);
line.setEndX(line.getStartX());
line.setEndY(line.getStartY());
sourceNode.startFullDrag();
root.getChildren().add(0, line);
}
}
}

DragStartHandler startHandler = new DragStartHandler();
EventHandler<MouseDragEvent> dragReleaseHandler = evt -> {
if (evt.getGestureSource() == evt.getSource()) {
// remove line, if it starts and ends in the same node
root.getChildren().remove(startHandler.line);
}
evt.consume();
startHandler.line = null;
};
EventHandler<MouseEvent> dragEnteredHandler = evt -> {
if (startHandler.line != null) {
// snap line end to node center
Node node = (Node) evt.getSource();
Bounds bounds = node.getBoundsInParent();
startHandler.line.setEndX((bounds.getMinX()+bounds.getMaxX())/2);

startHandler.line.setEndY((bounds.getMinY()+bounds.getMaxY())/2);
}
};

}

电线拉出并连接到的点

enter code here

public class createCircle extends Circle {

createCircle(){

super(25, Color.BLACK.deriveColor(0, 1, 1, 0.5));
}

}

enter image description here

最佳答案

您正在混合坐标系。

Bounds bounds = sourceNode.getBoundsInParent();

将为您提供 sourceNodesourceNode 父级坐标系中的边界,这将是当前的 Circuit实例(如果我正确地阅读了你的代码)。但是,您正在使用这些边界来计算放置在根节点中的线的坐标,因此您需要根坐标系中的坐标。

您可以通过执行类似的操作来转换坐标

Bounds boundsInScene = sourceNode.localToScene(sourceNode.getBoundsInLocal());
Bounds boundsInRoot = root.sceneToLocal(boundsInScene);

现在boundsInRoot表示sourceNoderoot坐标系中的边界,所以你可以用它来计算直线的坐标。您可能需要在整个代码中进行类似的转换。

关于java - 如何用一条线连接两个节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45392056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com