Canvas JavaFX:通过绘制擦除线

Canvas JavaFX:通过绘制擦除线,canvas,javafx,erase,Canvas,Javafx,Erase,我是JavaFX新手,我正在尝试在画布上绘制一些东西 首先,我将linecolor设置为黑色并绘制一条线 canvas.getGraphicsContext2D().setStroke(Color.BLACK); canvas.getGraphicsContext2D().strokeLine(20,20,100,100); 在此之后,我试图通过在这条线上画一条白线来擦除这条线: canvas.getGraphicsContext2D().setStroke(Color.WHITE); c

我是JavaFX新手,我正在尝试在画布上绘制一些东西

首先,我将linecolor设置为黑色并绘制一条线

canvas.getGraphicsContext2D().setStroke(Color.BLACK);
canvas.getGraphicsContext2D().strokeLine(20,20,100,100);
在此之后,我试图通过在这条线上画一条白线来擦除这条线:

canvas.getGraphicsContext2D().setStroke(Color.WHITE);  
canvas.getGraphicsContext2D().strokeLine(20,20,100,100);
但画布上会留下一些灰色像素。原因是什么?我该如何预防

这就是我创建场景的方式

Pane root = new Pane();
canvas = new Canvas(200, 200);
GraphicsContext gc = canvas.getGraphicsContext2D();
gc.strokeLine(20,20,100,100);
scene = new Scene(root, 200, 200);
this.setColor(Color.WHITE);
root.getChildren().add(canvas);

谢谢,Martin这个问题与抗锯齿有关。如果某个点具有非整数坐标,则其图形将被划分为几个像素并进行部分填充。像这样(放大): 所以,如果你画的东西不同于水平线或垂直线,你会得到这个效果。如果要绕过此效果,请使用逐像素绘制:

public class Test extends Application {

    @Override
    public void start(Stage primaryStage) {
        Canvas canvas = new Canvas();
        canvas.setWidth(200);
        canvas.setHeight(200);
        GraphicsContext gc = canvas.getGraphicsContext2D();

        gc.setLineWidth(4);
        gc.setStroke(Color.BLACK);
        drawLine(gc, 20, 20, 180, 180);
        gc.setStroke(Color.WHITE);
        drawLine(gc, 20, 20, 180, 180);

        Pane pane = new Pane(canvas);
        primaryStage.setScene(new Scene(pane));
        primaryStage.show();
    }

    private void drawLine(GraphicsContext gc, double x1, double y1, double x2, double y2) {
        double lineWidth = gc.getLineWidth();
        Color color = (Color) gc.getStroke();
        PixelWriter pw = gc.getPixelWriter();

        double k = (y2 - y1) / (x2 - x1);
        double b = (x1 * y2 - x2 * y1) / (x1 - x2);

        int val;
        for (int x = (int) x1; x <= (int) x2; x++) {
            val = (int) (k * x + b);
            for (int y = (int) (val - (lineWidth-1) / 2); y < val + lineWidth / 2; y++) {
                pw.setColor(x, y, color);
            }
        }

    }


    public static void main(String[] args) {
        launch(args);
    }
}
公共类测试扩展应用程序{
@凌驾
公共无效开始(阶段primaryStage){
画布=新画布();
画布设置宽度(200);
画布设置高度(200);
GraphicsContext gc=canvas.getGraphicsContext2D();
gc.设置线宽(4);
gc.设定行程(颜色为黑色);
抽绳(gc、20、20、180、180);
gc.设定行程(颜色为白色);
抽绳(gc、20、20、180、180);
窗格=新窗格(画布);
初始阶段。设置场景(新场景(窗格));
primaryStage.show();
}
专用空心抽绳(GraphicsContext gc,双x1,双y1,双x2,双y2){
double lineWidth=gc.getLineWidth();
Color Color=(Color)gc.getStroke();
PixelWriter pw=gc.getPixelWriter();
双k=(y2-y1)/(x2-x1);
双b=(x1*y2-x2*y1)/(x1-x2);
int-val;

对于(int x=(int)x1;x是
画布的背景色设置为白色?是的,我尝试了
Canvas.setStyle(“-fx background color:white;”;
((Pane)scene.getRoot()).setBackground(新背景(新背景填充(color.white,cornerridi.EMPTY,Insets.EMPTY)))
我发现了一些奇怪的东西,过了一段时间它确实变白了。试着循环13次。@Emrage的评论让我怀疑是锯齿伪影;请将你的问题包括在内,以显示你描述的问题。请参阅上面的编辑。有没有办法禁用抗锯齿?