提问者:小点点

如何让我的圈子随着类和鼠标点击而出现?


我是JavaFx的新手,我正在制作一个简单的绘图程序,在那里我可以绘制形状。我现在遇到的问题是,当我点击屏幕时,我不知道如何使圆圈出现在屏幕上。所以,首先我想按下一个显示“圆形”的按钮,然后当我单击画布时,我希望它产生。(我正在场景生成器和intellij btw之间切换)。

这是我的一些程序:

课程:


public abstract class Shape {

    double x;
    double y;
    double width;
    double height;

    public Color color = Color.WHITE;


    public void creatingShapes(double x, double y, int width, int height) {

        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;

    }

    public void setColor(Color color) {

        this.color = color;
    }

    public double getX() {
        return x;
    }

    public void setX(double x) {
        this.x = x;
    }

    public double getY() {
        return y;
    }

    public void setY(double y) {
        this.y = y;
    }

    public double getWidth() {
        return width;
    }

    public void setWidth(double width) {
        this.width = width;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    public Color getColor() {
        return color;
    }
    public abstract void draw(GraphicsContext g);

}

公共类Circle扩展Shape{

@Override

公共无效绘制(图形上下文 g) {

g.setFill(color);
g.fillOval(200,200,200,200);
g.fillRect(getX(),getY(),getWidth(),getHeight());
g.setStroke(Color.BLACK);
g.strokeOval(getX(),getY(),getWidth(),getHeight());

====================================================

控制器类别:

公共类HelloController{

@FXML
private Button logoutButton;
@FXML
private BorderPane scenePane;

Stage stage;

@FXML
private ColorPicker myColorPicker;
@FXML
private ChoiceBox<String> myChoiceBox;

@FXML
private Button circle;
@FXML
private GraphicsContext g;

private final Shape[] shapes = new Shape[500];

Canvas canvas = new Canvas(310,333);

boolean drawShape = true;
int count = 0;
private final Color currentColor = Color.BLUE;

private final String[] menuAlternatives = {"Sparning", "Testing?", "Exit?"};

public void onCircleClicked() {

    circle.setOnAction((event) -> addShape(new Circle()));



}



//skapa shapes
public void addShape(Shape shape) {

    shape.setColor(currentColor);
    shape.creatingShapes(10,10,150,100);
    shapes[count] = shape;
    count++;
    paintCanvas();
}


public void changeColor(ActionEvent event) {


    Color myColor = myColorPicker.getValue();
    scenePane.setBackground(new Background(new BackgroundFill(myColor, null, null)));



}


public void initialize() {

    g = canvas.getGraphicsContext2D();


}
public void paintCanvas() {

    g.setFill(Color.WHITE);
    g.fillRect(0,0,400,400);
    Arrays.stream(shapes, 0, count).forEach(s -> s.draw(g));


}



共1个答案

匿名用户

使用鼠标事件在画布上放置圆圈

来自文档

公共空隙填充椭圆形(双 X、双 Y、双 W、双 H)

使用当前填充油漆填充椭圆。此方法将受到渲染属性表中指定的任何全局通用属性或填充属性的影响。

参数:

x - 椭圆左上边界的 X 坐标。

y-椭圆左上边界的y坐标。

w-椭圆形中心的宽度。

h-椭圆形中心的高度。

正如我们所看到的,来自< code>fillOval()的x和y参数会将圆放在其边界的左上角。为了在它的正中心产卵,我们需要将mouseclick事件给出的x和y坐标减去一半widht和一半height。

这是一个你可以尝试的单类javafx应用程序

应用.java

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.paint.Color;
import javafx.stage.Stage;


 public class App extends Application {

    @Override
    public void start(Stage stage) {

        Canvas canvas = new Canvas(640, 480);
        GraphicsContext context = canvas.getGraphicsContext2D();
        canvas.setOnMouseClicked(e -> {

            double x = e.getX();
            double y = e.getY();           
            context.setFill(Color.AQUAMARINE);
            context.setStroke(Color.BLACK);
            context.fillOval(x - 20, y - 20, 40, 40);
            context.strokeOval(x - 20, y - 20, 40, 40);
        });

        var scene = new Scene(new Group(canvas), 640, 480);
        stage.setScene(scene);
        stage.setTitle("spawn with mouse click");
        stage.show();
    }

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

}