Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实现基于节点的图形GUI的最佳/最简单方法?_Java_User Interface_Javafx_Graphics_Nodes - Fatal编程技术网

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

Java 实现基于节点的图形GUI的最佳/最简单方法?,java,user-interface,javafx,graphics,nodes,Java,User Interface,Javafx,Graphics,Nodes,我正在尝试创建一个基于节点的图形界面。我曾经尝试过使用JavaFx,但是在连接节点时遇到了困难——我感觉我正在使用错误的技术解决问题 我研究过类似的问题,但答案似乎是基于面向对象的原则,而不是图形本身 解决这个问题最简单的方法是什么?有什么想法吗?提前感谢。如果您只是想用线连接一些节点,您可能只需要将它们添加到窗格中,并使用一条起点和终点绑定到节点坐标的线 下面是一个简单的示例,其中有几个矩形可以在窗格中拖动,线条与它们保持连接。显然,您可以对此进行改进,使连接线从矩形的适当一侧开始和结束,等等

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

我研究过类似的问题,但答案似乎是基于面向对象的原则,而不是图形本身


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

如果您只是想用线连接一些节点,您可能只需要将它们添加到窗格中,并使用一条起点和终点绑定到节点坐标的线

下面是一个简单的示例,其中有几个矩形可以在窗格中拖动,线条与它们保持连接。显然,您可以对此进行改进,使连接线从矩形的适当一侧开始和结束,等等,但它显示了基本思想

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);
    }
}

你还没有真正描述问题所在。通常对于像这样的“连接”(边),我只会将直线(或曲线)的起点和终点绑定到相应节点的坐标上。如果我有点含糊不清,请原谅。从概念上讲,我理解如何做到这一点——这只是技术实现。例如,在JavaFx中,我会对单个节点使用窗格,但是如何连接它们呢?我不能只使用画布节点来绘制每条线。我也不能在画布上完成整个GUI,因为那样会非常笨拙。在HTML5中,我可以很好地划分界限,但是窗格和GUI本身要困难得多。我希望有人给我指出正确的方向:)使用组节点,为长方体添加矩形,为连接端点添加较小的矩形,并为连接添加直线/曲线。