Как соединить два круга, где каждый находится на панели в JavaFX? - PullRequest
0 голосов
/ 21 февраля 2019

Мне было интересно, может ли кто-нибудь дать мне совет по соединению двух узлов, каждый из которых находится на отдельной панели.Я делаю творческий проект по программированию, целью которого является демонстрация графических алгоритмов.это мой прогресс до сих пор.Вот изображения вместе с описанием того, что происходит:

Создайте два CircleNodes (CircleNodes - это класс, расширяющий группу. Они состоят из Circle и метки, добавленной в панель), A и B, черездвойной щелчок

enter image description here

Начать полную линию перетаскивания с источником на A. Перетянутая линия - это просто визуальный элемент для пользователя

enter image description here

Для завершения перетаскивания отпустите на B и создайте два LinkNode от A до B и от B до A

enter image description here

Создайте LinkNode (просто класс, который расширяет группу и состоит из функции line и distance ()) от A до B, чтобы узлы могли связываться друг с другом.

Проблема в том, что когдасоздав LinkNode, получив centerX и centerY круга на панели, линия в LinkNode отличается от позиции, для которой предназначен.Я вполне уверен, что проблема не в том, что невозможно получить координаты окружности внутри панели.

CircleNode (DraggedLine в основном не имеет значения, но может вызывать проблемы):

    class CircleNode extends Pane {
    //Node will have fixed height and width
    private final static int R = 20;
    //Node will have a name so that it can be found
    private String name;
    private DraggedLine draggedLine;
    private double x, y;
    private Circle circle;
    private Pane layout;
    //collection of colors which the circle can be
    CircleNode(double x, double y, String name){
        layout = new StackPane();
        Color[] colors = {Color.BLUE, Color.GRAY, Color.YELLOW, Color.GREEN, Color.VIOLET};
        int randColorIndex = (int)(Math.random() * colors.length);
        Label label = new Label(name);
        this.name = name;
        circle = new Circle(R);
        circle.setFill(colors[randColorIndex]);
        circle.setStrokeWidth(2);
        circle.setStroke(Color.BLACK);
        setTranslateX(x);
        setTranslateY(y);
        //lost on what to do here
        //layout.setTranslateX(x);
        //layout.setTranslateY(y);
        //circle.setCenterX(x);
        //circle.setCenterY(y);
        //circle.setLayoutX(x);
        //circle.setLayoutY(y);
        this.createLinkHandler();
        layout.getChildren().addAll(circle, label);
        getChildren().add(layout);
        display();
    }

    private void createLinkHandler(){
        this.setOnDragDetected(de -> {
            this.startFullDrag();
            System.out.println("Full drag started on " + ((CircleNode)de.getSource()).getName());
            //System.out.println("Drag detected and Full drag started");
            //Line line = drawLine(de.get)
            //LinkNode temp_link = new LinkNode(this.getTranslateX(), this.getTranslateY(), de.getX(), de.getY()) );
        });
        this.setOnMouseDragged(de -> {
            this.getChildren().remove(draggedLine);
            draggedLine = new DraggedLine(circle.getLayoutX(), circle.getLayoutY(), de.getX(), de.getY());
            this.getChildren().add(draggedLine);
        });
        this.setOnMouseDragReleased(de -> {
            this.getChildren().remove(draggedLine);
            CircleNode source = (CircleNode)de.getGestureSource();
            if(de.getGestureSource() == null){
                System.out.println("Failed to create link\nNo CircleNode found to complete the drag");
                return;
            }
            System.out.println("Drag started on " + source.getName() + " and ended on: " + this.name);
            this.getChildren().add(new LinkNode(source, this));
            source.getChildren().add(new LinkNode(this, source));

            this.getChildren().remove(draggedLine);
        });        
    }

    public void display(){
        System.out.println("Layout x, y: " + layout.getTranslateX() + ", " + layout.getTranslateY() );
        System.out.println("Circle x, y:  " + circle.getCenterX() + ", " + circle.getCenterY());
        System.out.println("Translate x, y: " + getTranslateX() + ", " + getTranslateY());
    }

    public String getName(){ return name; }

    public Circle getCircle(){ return circle;}

    public Pane getLayout(){ return layout;}

    public void removeDraggedLine(){if(draggedLine != null) getChildren().remove(draggedLine);}

    private static Line drawLine(double x1, double y1, double x2, double y2){
        return new Line(x1, y1, x2, y2);
    }


    }

    class DraggedLine extends Group{
    private Line line;

    DraggedLine(double x1, double y1, double x2, double y2){
        drawLine(x1, y1, x2, y2);
        getChildren().add(line);
    }

    public void drawLine(double x1, double y1, double x2, double y2){
        this.line = new Line(x1, y1, x2, y2);
    }

    }

LinkNode:

    class LinkNode extends Group {
    private double distance;
    private CircleNode start, end;
    private Line line;

    LinkNode(CircleNode start, CircleNode end){
        if(start.getName().equals(end.getName())){
            System.out.println("You can't connect a circle node to itself");
            return;
        }
        this.start = start;
        this.end = end;
        //this is part causing problems:
        //Circle c1 = start.getCircle(), c2 = end.getCircle();
        //double x1 = c1.getCenterX(), y1= c1.getCenterY(), x2 = c2.getCenterX(), y2 = c2.getCenterY();
        //double x1 = c1.getCenterX(), y1= c1.getCenterY(), x2 = c2.getCenterX(), y2 = c2.getCenterY();
        double x1 = start.getTranslateX(), y1= start.getTranslateY(), x2 = end.getTranslateX(), y2= start.getTranslateY();
        distance = distance(x1, y1, x2, y2);
        line = new Line(x1, y1, x2, y2);
        line.setStroke(Color.MIDNIGHTBLUE);
        line.setStrokeWidth(3);
        getChildren().add(line);
        System.out.println(toString());
        System.out.println("Coordinate start: " + x1 + ", " + y1 +"\nCoordinate end: " + x2 + ", " + y2);
        start.removeDraggedLine();
        end.removeDraggedLine();
    }

    public String toString(){ return start.getName() + "->" + end.getName() + "\nDistance: " + distance;}

    private static double distance(double x1, double y1, double x2,double  y2){
        return Math.sqrt( Math.pow((x1 - x2), 2) + Math.pow((y1 - y2), 2));
    }

    public double getDistance(){
        return distance;
    }

    public Line getLine(){
        return line;
    }

    public CircleNode getStart(){
        return start;
    }

    public CircleNode getEnd(){
        return end;
    }
}

РедактироватьЯ смог решить проблему, просто отказавшись от использования панели, но таким образом я не могу отобразить имя узла.Новые изображения:

Создайте два узла, A и B, имена которых не могут быть отображены, поскольку они находятся в группе Начните перетаскивание на одном и отпустите перетаскивание на другомсоздать связь между двумя сделать то же самое с другим узлом

class CircleNode extends Group{
    private String name;
    private double x, y;
    private Circle circle;
    private Line draggedLine;
    private Pane layout;
    private static final int R = 15;

    public CircleNode(double x, double y, String name){
        //layout = new Pane();
        //layout.getChildren().add(label);
        this.name = name;
        circle = new Circle(x, y, R);
        Label label = new Label(name, circle);
        this.x = x;
        this.y = y;
        circle.setFill(selectColor());
        circle.setStrokeWidth(2);
        circle.setStroke(Color.BLACK);
        this.createLinkHandler();
        getChildren().addAll(circle);
    }

    private void createLinkHandler(){
        this.setOnDragDetected(de -> {
            this.startFullDrag();
           // draggedLine = new Line(x, y, de.getX(), de.getY());
            System.out.println("Full drag started on " + ((CircleNode)de.getSource()).name);
            //System.out.println("Drag detected and Full drag started");
            //Line line = drawLine(de.get)
            //LinkNode temp_link = new LinkNode(this.getTranslateX(), this.getTranslateY(), de.getX(), de.getY()) );
        });

        this.setOnMouseDragged(de -> {
            //getChildren().remove(draggedLine);
            //draggedLine = new Line(x, y, de.getX(), de.getY());
            //getChildren().add(draggedLine);
        });

        this.setOnMouseDragReleased(de -> {
            System.out.println("Full drag ended on: " + this.name);
            //getChildren().remove(draggedLine);
            CircleNode source = (CircleNode)de.getGestureSource();
            if(de.getGestureSource() == null){
                System.out.println("Failed to create link, No CircleNode found to complete the drag");
                return;
            }
            //System.out.println("Drag started on " + source.name + " and ended on: " + this.name);
            this.getChildren().add(new LinkNode(source, this));
            source.getChildren().add(new LinkNode(this, source));
        });
    }

    public Color selectColor(){
        Color[] colors = {Color.VIOLET, Color.GREEN, Color.GRAY, Color.GOLD, Color.BLUE, Color.BLUEVIOLET, Color.YELLOW};
        return colors[(int)(Math.random() * (colors.length - 1 - 1) + 1)];
    }

    public Circle getCircle(){
        return circle;
    }
}

class LinkNode extends Group{
    private Line line;
    private CircleNode start, end;
    private double distance;
    public LinkNode(CircleNode start, CircleNode end){
        this.start = start;
        this.end = end;
        double x1 = start.getCircle().getCenterX(), y1 = start.getCircle().getCenterY(), x2 = end.getCircle().getCenterX(),
                y2 = end.getCircle().getCenterY();
        line = new Line(x1, y1, x2, y2);
        this.distance = distance(x1, y1, x2, y2);
        getChildren().add(line);
    }

    public static double distance(double x1, double y1, double x2, double y2){
        return Math.sqrt( Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2) );
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...