Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.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
JavaFX中拖在光标后面的圆圈_Java_Javafx - Fatal编程技术网

JavaFX中拖在光标后面的圆圈

JavaFX中拖在光标后面的圆圈,java,javafx,Java,Javafx,我有一个程序,在一个窗格中拖动两个圆。还有一条线将它们连接起来,并在其上方显示距离。我的问题在于,当我用鼠标缓慢拖动圆圈时,它们移动得很好,但当我移动得更快时,圆圈停止了 此处是计算圆阻力的位置 pane.setOnMouseDragged(e -> { if (circle1.contains(e.getX(), e.getY())) { pane.getChildren().clear(); circle1.setCent

我有一个程序,在一个窗格中拖动两个圆。还有一条线将它们连接起来,并在其上方显示距离。我的问题在于,当我用鼠标缓慢拖动圆圈时,它们移动得很好,但当我移动得更快时,圆圈停止了

此处是计算圆阻力的位置

pane.setOnMouseDragged(e -> {
        if (circle1.contains(e.getX(), e.getY())) {
            pane.getChildren().clear();
            circle1.setCenterX(e.getX());
            circle1.setCenterY(e.getY());
            pane.getChildren().addAll(getLine(circle1, circle2), circle1,
                circle2, getText(circle1, circle2));
        }
        else if (circle2.contains(e.getX(), e.getY())) {
            pane.getChildren().clear();
            circle2.setCenterX(e.getX());
            circle2.setCenterY(e.getY());
            pane.getChildren().addAll(getLine(circle1, circle2), circle1,
                circle2, getText(circle1, circle2));
        }
    });

我认为现在发生的是,当鼠标快速移动时,处理两个连续事件之间移动的距离超出了圆的边界,因此if条件变为false。您可能需要在圆圈本身而不是窗格上注册鼠标处理程序。(顺便提一下,为什么要清除并重建窗格,而不是只更新行?)

下面是一个使用这些技术的示例:

import javafx.application.Application;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.geometry.Point2D;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
import javafx.stage.Stage;

public class DraggingCircles extends Application {

    @Override
    public void start(Stage primaryStage) {
        Pane pane = new Pane();
        Circle circle1 = createDraggingCircle(50, 50, 25, Color.BLUE);
        Circle circle2 = createDraggingCircle(350, 350, 25, Color.RED);
        Line line = new Line();
        line.startXProperty().bind(circle1.centerXProperty());
        line.startYProperty().bind(circle1.centerYProperty());
        line.endXProperty().bind(circle2.centerXProperty());
        line.endYProperty().bind(circle2.centerYProperty());
        pane.getChildren().addAll(circle1, circle2, line);

        Scene scene = new Scene(pane, 400, 400);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private Circle createDraggingCircle(double x, double y, double radius, Color fill) {
        Circle circle = new Circle(x, y, radius, fill);
        ObjectProperty<Point2D> mouseLocation = new SimpleObjectProperty<>();

        circle.setOnMousePressed(e -> {
            mouseLocation.set(new Point2D(e.getX(), e.getY()));
        });

        circle.setOnMouseDragged(e -> {
            double deltaX = e.getX() - mouseLocation.get().getX();
            double deltaY = e.getY() - mouseLocation.get().getY();
            circle.setCenterX(circle.getCenterX() + deltaX);
            circle.setCenterY(circle.getCenterY() + deltaY);
            mouseLocation.set(new Point2D(e.getX(), e.getY()));
        });

        return circle ;
    }

    public static void main(String[] args) {
        launch(args);
    }
}
导入javafx.application.application;
导入javafx.beans.property.ObjectProperty;
导入javafx.beans.property.SimpleObject属性;
导入javafx.geometry.Point2D;
导入javafx.scene.scene;
导入javafx.scene.layout.Pane;
导入javafx.scene.paint.Color;
导入javafx.scene.shape.Circle;
导入javafx.scene.shape.Line;
导入javafx.stage.stage;
公共类DraggingCircles扩展了应用程序{
@凌驾
公共无效开始(阶段primaryStage){
窗格=新窗格();
Circle circle1=createDraggingCircle(50,50,25,颜色.蓝色);
圆圈2=createDraggingCircle(350、350、25,颜色为红色);
行=新行();
line.startXProperty().bind(圆圈1.centerXProperty());
line.startYProperty().bind(圆圈1.centerYProperty());
line.endXProperty().bind(圆圈2.centerXProperty());
line.endYProperty().bind(圆圈2.centerYProperty());
pane.getChildren().addAll(圈1,圈2,行);
场景=新场景(窗格,400400);
初级阶段。场景(场景);
primaryStage.show();
}
专用圆CreateDragingCircle(双x、双y、双半径、彩色填充){
圆=新圆(x、y、半径、填充);
ObjectProperty mouseLocation=新的SimpleObjectProperty();
圆圈。设置鼠标按下(e->{
set(新的Point2D(e.getX(),e.getY());
});
circle.setonMouseDrawed(e->{
double deltaX=e.getX()-mouseLocation.get().getX();
双deltaY=e.getY()-mouseLocation.get().getY();
circle.setCenterX(circle.getCenterX()+deltaX);
circle.setCenterY(circle.getCenterY()+deltaY);
set(新的Point2D(e.getX(),e.getY());
});
返回圈;
}
公共静态void main(字符串[]args){
发射(args);
}
}