Javafx在画布上拖放形状

时间:2015-12-05 22:34:28

标签: java javafx drag-and-drop shape

我是Java的初学者,需要一些帮助我的应用程序。 我想在javafx画布上使用拖放定制的形状,即构成领结的多个多边形。

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

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

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

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

}

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

有人可以帮帮我吗?

由于

1 个答案:

答案 0 :(得分:3)

使用您提供的链接,以下是将其与您的工作相结合的方式:

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

希望这有帮助。