首页 > 解决方案 > 在 javaFX 中为行添加约束

问题描述

我将如何去添加一个可以拖动多少线的约束?我有一个火柴人,你可以拖动他所有的胳膊和腿,头部和背部,但我希望它们保持与开始时相同的长度,所以你不能将它们拉伸得比应有的更长或更短,只需移动它们上下、左右、围成一圈等。我想我必须对开始/结束 x 和 y 做一些事情,但我不确定如何为其设置一个设置约束,并且仍然让它可以拖动并保持不变一样长

private Line connectLines(Line line, Circle startNode, Circle endNode) {
        line.startXProperty().bind(startNode.centerXProperty().add(startNode.translateXProperty()));
        line.startYProperty().bind(startNode.centerYProperty().add(startNode.translateYProperty()));
        line.endXProperty().bind(endNode.centerXProperty().add(endNode.translateXProperty()));
        line.endYProperty().bind(endNode.centerYProperty().add(endNode.translateYProperty()));

    return line;
}           
       //mouse pressed event
        EventHandler<MouseEvent> mousePressed = new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent e) {
            System.out.println("pressed");
            sceneX = e.getSceneX();
            sceneY = e.getSceneY();
            translateCircleX = ((Circle)(e.getSource())).getTranslateX();
            translateCircleY = ((Circle)(e.getSource())).getTranslateY();
        }
    };


    //mouse dragged event
    EventHandler<MouseEvent> mouseDragged = new EventHandler<MouseEvent>() {
        @Override
            public void handle(MouseEvent e) {
            System.out.println("dragged");
                double offsetX = e.getSceneX() - sceneX;
                double offsetY = e.getSceneY() - sceneY;
                double newTranslateCircleX = translateCircleX + offsetX;
                double newTranslateCircleY = translateCircleY + offsetY;
            ((Circle)(e.getSource())).setTranslateX(newTranslateCircleX);
            ((Circle)(e.getSource())).setTranslateY(newTranslateCircleY);
        }
    };

标签: javajavafx

解决方案


这是一个例子。此示例不使用Circle.setTranslate#. 它使用Circle.setCenter#. 它还用于Math.hypot跟踪Line长度。如果线条长度大于或等于 100,则减去形状移动的变化。

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
import javafx.stage.Stage;

public class TableViewDemo2 extends Application
{

    double sceneX, sceneY;

    Circle circle = new Circle(15, Color.RED);
    Circle circle2 = new Circle(15, Color.BLUE);
    Line line = new Line();

    private Line connectLines(Line line, Circle startNode, Circle endNode)
    {
        line.startXProperty().bind(startNode.centerXProperty());
        line.startYProperty().bind(startNode.centerYProperty());
        line.endXProperty().bind(endNode.centerXProperty());
        line.endYProperty().bind(endNode.centerYProperty());

        return line;
    }
    //mouse pressed event
    EventHandler<MouseEvent> mousePressed = new EventHandler<MouseEvent>()
    {
        @Override
        public void handle(MouseEvent e)
        {
            System.out.println("pressed");

            sceneX = e.getSceneX();
            sceneY = e.getSceneY();

            Circle tempCircle = ((Circle) e.getSource());
            tempCircle.toFront();
        }
    };

    //mouse dragged event
    EventHandler<MouseEvent> mouseDragged = new EventHandler<MouseEvent>()
    {
        @Override
        public void handle(MouseEvent e)
        {
            System.out.println(Math.hypot(line.getBoundsInLocal().getWidth(), line.getBoundsInLocal().getHeight()));

            System.out.println("dragged");
            double offSetX = e.getSceneX() - sceneX;
            double offSetY = e.getSceneY() - sceneY;

            Circle tempCircle = ((Circle) (e.getSource()));
            tempCircle.setCenterX(tempCircle.getCenterX() + offSetX);
            tempCircle.setCenterY(tempCircle.getCenterY() + offSetY);

            if (Math.hypot(line.getBoundsInLocal().getWidth(), line.getBoundsInLocal().getHeight()) >= 100) {
                tempCircle.setCenterX(tempCircle.getCenterX() - offSetX);
                tempCircle.setCenterY(tempCircle.getCenterY() - offSetY);
            }

            sceneX = e.getSceneX();
            sceneY = e.getSceneY();
        }
    };


    @Override
    public void start(Stage stage)
    {

        circle.setOnMouseDragged(mouseDragged);
        circle2.setOnMouseDragged(mouseDragged);

        Line returnLine = connectLines(line, circle, circle2);

        StackPane root = new StackPane(new Pane(circle, circle2, returnLine));

        stage.setTitle("TableView (o7planning.org)");

        Scene scene = new Scene(root, 450, 300);
        stage.setScene(scene);
        stage.show();
    }

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

推荐阅读