画布上的Javafx拖放形状

画布上的Javafx拖放形状,java,javafx,drag-and-drop,shape,Java,Javafx,Drag And Drop,Shape,我是Java的初学者,需要一些应用程序方面的帮助。 我想用javafxcanvas在定制的形状上进行拖放,即多个多边形组成领结 我创建了一个绘制领结的方法,如下所示: public void joonistaBowTie(GraphicsContext gc) { // Bowtie left side gc.setFill(Color.RED); double xpoints[] = { 242, 242, 200 }; double ypoints[] = { 245, 290, 270 }

我是Java的初学者,需要一些应用程序方面的帮助。 我想用javafxcanvas在定制的形状上进行拖放,即多个多边形组成领结

我创建了一个绘制领结的方法,如下所示:

public void joonistaBowTie(GraphicsContext gc) {
// Bowtie left side
gc.setFill(Color.RED);
double xpoints[] = { 242, 242, 200 };
double ypoints[] = { 245, 290, 270 };
int num = 3;
gc.fillPolygon(xpoints, ypoints, num);
// Bowtie right side
gc.setFill(Color.RED);
double xpoints1[] = { 160, 160, 200 };
double ypoints1[] = { 245, 290, 270 };
int num1 = 3;
gc.fillPolygon(xpoints1, ypoints1, num1);
// Bowtie middle part
gc.setFill(Color.RED);
gc.fillOval(190, 255, 20, 30);
}
public class GraafikaNaide extends Application {
Bowtie bowtie;

@Override
public void start(Stage primaryStage) {
    primaryStage.setTitle("JavaFX-iga joonistatud kloun");
    Group root = new Group();
    Canvas canvas = new Canvas(1000, 1000);
    GraphicsContext gc = canvas.getGraphicsContext2D();
    joonista(gc);
    root.getChildren().add(canvas);
    primaryStage.setScene(new Scene(root));
    primaryStage.show();
}

private void joonista(GraphicsContext gc) {
    Bowtie bowtie = new Bowtie();
    bowtie.joonistaBowTie(gc);

}
我已经将该方法移动到一个名为BowTie的单独类中。 我还有一个主类,看起来像这样:

public void joonistaBowTie(GraphicsContext gc) {
// Bowtie left side
gc.setFill(Color.RED);
double xpoints[] = { 242, 242, 200 };
double ypoints[] = { 245, 290, 270 };
int num = 3;
gc.fillPolygon(xpoints, ypoints, num);
// Bowtie right side
gc.setFill(Color.RED);
double xpoints1[] = { 160, 160, 200 };
double ypoints1[] = { 245, 290, 270 };
int num1 = 3;
gc.fillPolygon(xpoints1, ypoints1, num1);
// Bowtie middle part
gc.setFill(Color.RED);
gc.fillOval(190, 255, 20, 30);
}
public class GraafikaNaide extends Application {
Bowtie bowtie;

@Override
public void start(Stage primaryStage) {
    primaryStage.setTitle("JavaFX-iga joonistatud kloun");
    Group root = new Group();
    Canvas canvas = new Canvas(1000, 1000);
    GraphicsContext gc = canvas.getGraphicsContext2D();
    joonista(gc);
    root.getChildren().add(canvas);
    primaryStage.setScene(new Scene(root));
    primaryStage.show();
}

private void joonista(GraphicsContext gc) {
    Bowtie bowtie = new Bowtie();
    bowtie.joonistaBowTie(gc);

}
我还发现了一些关于如何进行拖放的知识,但我只是缺乏如何将此代码实现到我的代码中的知识

有人能帮我吗


感谢使用您提供的链接,以下是您将如何将其与工作结合起来:

public class GraafikaNaide extends Application
{
    joonistaBowTie bowtie;
    double orgSceneX, orgSceneY;
    double orgTranslateX, orgTranslateY;

    @Override
    public void start(Stage primaryStage)
    {
        Canvas canvas = new Canvas(1000, 1000);
        GraphicsContext gc = canvas.getGraphicsContext2D();
        joonista(gc);
        canvas.setOnMousePressed(canvasOnMousePressedEventHandler);
        canvas.setOnMouseDragged(canvasOnMouseDraggedEventHandler);

        Group root = new Group();
        root.getChildren().add(canvas);

        primaryStage.setTitle("JavaFX-iga joonistatud kloun");
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }

    private void joonista(GraphicsContext gc)
    {
        joonistaBowTie bowtie = new joonistaBowTie();
        bowtie.joinBowTie(gc);
    }

    EventHandler<MouseEvent> canvasOnMousePressedEventHandler = new EventHandler<MouseEvent>()
    {
        @Override
        public void handle(MouseEvent mouseEvent)
        {
            orgSceneX = mouseEvent.getSceneX();
            orgSceneY = mouseEvent.getSceneY();
            orgTranslateX = ((Canvas)(mouseEvent.getSource())).getTranslateX();
            orgTranslateY = ((Canvas) (mouseEvent.getSource())).getTranslateY();
        }
    };

    EventHandler<MouseEvent> canvasOnMouseDraggedEventHandler = new EventHandler<MouseEvent>()
    {
        @Override
        public void handle(MouseEvent mouseEvent)
        {
            double offsetX = mouseEvent.getSceneX() - orgSceneX;
            double offsetY = mouseEvent.getSceneY() - orgSceneY;
            double newTranslateX = orgTranslateX + offsetX;
            double newTranslateY = orgTranslateY + offsetY;

            ((Canvas) (mouseEvent.getSource())).setTranslateX(newTranslateX);  //transform the object
            ((Canvas) (mouseEvent.getSource())).setTranslateY(newTranslateY);
        }
    };
}
公共类GraafikaNaide扩展应用程序
{
朱迪安·阿博蒂领结;
双orgSceneX,orgSceneY;
双orgTranslateX,orgTranslateY;
@凌驾
公共无效开始(阶段primaryStage)
{
画布=新画布(10001000);
GraphicsContext gc=canvas.getGraphicsContext2D();
约安西亚(gc);
canvas.setOnMousePressed(canvasousepressedeventhandler);
canvas.setOnMouseDragged(canvasousedraggedeventhandler);
组根=新组();
root.getChildren().add(画布);
setTitle(“JavaFX-iga-joinistratud-kloun”);
primaryStage.setScene(新场景(根));
primaryStage.show();
}
私有void joinistra(GraphicsContext gc)
{
Joanisabowtie蝴蝶结=新Joanisabowtie();
领结.细缝领结(gc);
}
EventHandler canvasOnMousePressedEventHandler=新的EventHandler()
{
@凌驾
公共无效句柄(MouseEvent MouseEvent)
{
orgSceneX=mouseEvent.getSceneX();
orgSceneY=mouseEvent.getSceneY();
orgTranslateX=((画布)(mouseEvent.getSource()).getTranslateX();
orgTranslateY=((画布)(mouseEvent.getSource()).getTranslateY();
}
};
EventHandler Canvasousedraggedeventhandler=新的EventHandler()
{
@凌驾
公共无效句柄(MouseEvent MouseEvent)
{
double offsetX=mouseEvent.getSceneX()-orgSceneX;
double offsetY=mouseEvent.getSceneY()-orgSceneY;
双新Translatex=orgTranslateX+offsetX;
双新Translatey=orgTranslateY+offsetY;
((Canvas)(mouseEvent.getSource()).setTranslateX(newTranslateX);//变换对象
((Canvas)(mouseEvent.getSource()).setTranslateY(newTranslateY);
}
};
}

希望这对您有所帮助。

使用您提供的链接,以下是您将如何将其与您的工作结合起来:

public class GraafikaNaide extends Application
{
    joonistaBowTie bowtie;
    double orgSceneX, orgSceneY;
    double orgTranslateX, orgTranslateY;

    @Override
    public void start(Stage primaryStage)
    {
        Canvas canvas = new Canvas(1000, 1000);
        GraphicsContext gc = canvas.getGraphicsContext2D();
        joonista(gc);
        canvas.setOnMousePressed(canvasOnMousePressedEventHandler);
        canvas.setOnMouseDragged(canvasOnMouseDraggedEventHandler);

        Group root = new Group();
        root.getChildren().add(canvas);

        primaryStage.setTitle("JavaFX-iga joonistatud kloun");
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }

    private void joonista(GraphicsContext gc)
    {
        joonistaBowTie bowtie = new joonistaBowTie();
        bowtie.joinBowTie(gc);
    }

    EventHandler<MouseEvent> canvasOnMousePressedEventHandler = new EventHandler<MouseEvent>()
    {
        @Override
        public void handle(MouseEvent mouseEvent)
        {
            orgSceneX = mouseEvent.getSceneX();
            orgSceneY = mouseEvent.getSceneY();
            orgTranslateX = ((Canvas)(mouseEvent.getSource())).getTranslateX();
            orgTranslateY = ((Canvas) (mouseEvent.getSource())).getTranslateY();
        }
    };

    EventHandler<MouseEvent> canvasOnMouseDraggedEventHandler = new EventHandler<MouseEvent>()
    {
        @Override
        public void handle(MouseEvent mouseEvent)
        {
            double offsetX = mouseEvent.getSceneX() - orgSceneX;
            double offsetY = mouseEvent.getSceneY() - orgSceneY;
            double newTranslateX = orgTranslateX + offsetX;
            double newTranslateY = orgTranslateY + offsetY;

            ((Canvas) (mouseEvent.getSource())).setTranslateX(newTranslateX);  //transform the object
            ((Canvas) (mouseEvent.getSource())).setTranslateY(newTranslateY);
        }
    };
}
公共类GraafikaNaide扩展应用程序
{
朱迪安·阿博蒂领结;
双orgSceneX,orgSceneY;
双orgTranslateX,orgTranslateY;
@凌驾
公共无效开始(阶段primaryStage)
{
画布=新画布(10001000);
GraphicsContext gc=canvas.getGraphicsContext2D();
约安西亚(gc);
canvas.setOnMousePressed(canvasousepressedeventhandler);
canvas.setOnMouseDragged(canvasousedraggedeventhandler);
组根=新组();
root.getChildren().add(画布);
setTitle(“JavaFX-iga-joinistratud-kloun”);
primaryStage.setScene(新场景(根));
primaryStage.show();
}
私有void joinistra(GraphicsContext gc)
{
Joanisabowtie蝴蝶结=新Joanisabowtie();
领结.细缝领结(gc);
}
EventHandler canvasOnMousePressedEventHandler=新的EventHandler()
{
@凌驾
公共无效句柄(MouseEvent MouseEvent)
{
orgSceneX=mouseEvent.getSceneX();
orgSceneY=mouseEvent.getSceneY();
orgTranslateX=((画布)(mouseEvent.getSource()).getTranslateX();
orgTranslateY=((画布)(mouseEvent.getSource()).getTranslateY();
}
};
EventHandler Canvasousedraggedeventhandler=新的EventHandler()
{
@凌驾
公共无效句柄(MouseEvent MouseEvent)
{
double offsetX=mouseEvent.getSceneX()-orgSceneX;
double offsetY=mouseEvent.getSceneY()-orgSceneY;
双新Translatex=orgTranslateX+offsetX;
双新Translatey=orgTranslateY+offsetY;
((Canvas)(mouseEvent.getSource()).setTranslateX(newTranslateX);//变换对象
((Canvas)(mouseEvent.getSource()).setTranslateY(newTranslateY);
}
};
}

希望这能有所帮助。

如果以后要修改形状(例如移动形状),请不要使用画布。相反,通过创建形状来使用场景图结构(例如,并将它们添加到a中。您链接的示例与此功能得到的示例一样简单,因此您应该研究该示例,并阅读您不熟悉的任何类的示例。谢谢,您是第一个说使用画布不符合我的要求的人。如果要修改形状(例如移动形状),请不要使用画布)稍后。取而代之的是,通过创建形状(例如,并将其添加到)来使用场景图结构。您链接的示例与此功能得到的一样简单,因此您应该学习这一点,并阅读您不熟悉的任何类的。谢谢,您是第一个说使用画布做我想要的事情是不现实的人。