gpt4 book ai didi

java - 实现基于节点的图形 GUI 的最佳/最简单方法?

转载 作者:行者123 更新时间:2023-11-30 10:38:49 24 4
gpt4 key购买 nike

我正在尝试创建一个基于节点的图形界面,à la blenderunreal engine .我尝试过使用 JavaFx,但是我在连接节点时遇到了困难——我感觉我正在使用错误的技术来解决问题。

我检查了 this类似的问题,但是答案似乎是基于 OOP 原则而不是图形本身。

解决这个问题最简单的方法是什么?有任何想法吗?提前致谢。

最佳答案

如果您只是想用线连接一些节点,您可能只需要将它们添加到一个 Pane 中,其中一条线的起点和终点绑定(bind)到节点的坐标。

这是一个简单的示例,其中包含几个可以在 Pane 周围拖动的矩形,直线与它们保持连接。显然,您可以改进这一点,使连接线从矩形的适当边开始和结束,等等,但它展示了基本思想。

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Line;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class ConnectedBoxes extends Application {

@Override
public void start(Stage primaryStage) {
Rectangle startBox = createDraggableBox(50, 50);
startBox.setX(50);
startBox.setY(50);

Rectangle endBox = createDraggableBox(50, 50);
endBox.setX(350);
endBox.setY(200);

Line connector = createConnector(startBox, endBox);

Pane pane = new Pane(startBox, endBox, connector);
Scene scene = new Scene(pane, 600, 600);
primaryStage.setScene(scene);
primaryStage.show();
}

private Line createConnector(Node start, Node end) {
Line l = new Line();
l.startXProperty().bind(Bindings.createDoubleBinding(
() -> start.getBoundsInParent().getMaxX(),
start.boundsInParentProperty()));
l.startYProperty().bind(Bindings.createDoubleBinding(
() -> start.getBoundsInParent().getMinY() + start.getBoundsInParent().getHeight() / 2,
start.boundsInParentProperty()));
l.endXProperty().bind(Bindings.createDoubleBinding(
() -> end.getBoundsInParent().getMinX(),
end.boundsInParentProperty()));
l.endYProperty().bind(Bindings.createDoubleBinding(
() -> end.getBoundsInParent().getMinY() + end.getBoundsInParent().getHeight() / 2,
end.boundsInParentProperty()));
return l ;

}

public Rectangle createDraggableBox(int width, int height) {
Rectangle r = new Rectangle(width, height);
r.setFill(Color.CORAL);

DragDelta delta = new DragDelta();

r.setOnMousePressed(e -> {
delta.x = e.getX();
delta.y = e.getY();
});

r.setOnMouseDragged(e -> {
double deltaX = e.getX() - delta.x ;
double deltaY = e.getY() - delta.y ;
r.setX(r.getX() + deltaX);
r.setY(r.getY() + deltaY);
delta.x = e.getX();
delta.y = e.getY();
});

return r ;
}

class DragDelta { double x,y ;}

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

关于java - 实现基于节点的图形 GUI 的最佳/最简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39556757/

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