Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.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画布绘制1像素线?_Java_Javafx - Fatal编程技术网

如何使用Javafx画布绘制1像素线?

如何使用Javafx画布绘制1像素线?,java,javafx,Java,Javafx,我一直在谷歌搜索,发现了一些相关的问题/帖子,但没有一个能解决我的问题 我正在画布上直接绘制线条(JavaFX),使用: 我想要1像素宽的线条。所以我将线宽设为1。 我明白了: 请注意,这些线是模糊的。它不是1像素。 我尝试将线宽设置为0.1或0.01等。它不会更改结果 顺便说一下。。。我不明白为什么这个参数是双精度的。我在某个地方读到它与新闻部有关。但我不明白什么是单位,它是如何转换成像素的。 Oracle的文档对此没有帮助。(或者我没有找到有帮助的) 我想换成这个: 这是在另一个平台上实

我一直在谷歌搜索,发现了一些相关的问题/帖子,但没有一个能解决我的问题

我正在画布上直接绘制线条(JavaFX),使用:

我想要1像素宽的线条。所以我将线宽设为1。 我明白了:

请注意,这些线是模糊的。它不是1像素。 我尝试将线宽设置为0.1或0.01等。它不会更改结果

顺便说一下。。。我不明白为什么这个参数是双精度的。我在某个地方读到它与新闻部有关。但我不明白什么是单位,它是如何转换成像素的。 Oracle的文档对此没有帮助。(或者我没有找到有帮助的)

我想换成这个:

这是在另一个平台上实现的。请注意,线条是尖锐的,只有一个1像素。

将每个像素想象成一个(小)矩形(而不是一个点)。整数坐标是像素之间的边界;因此,具有整数坐标的(水平或垂直)线落在“像素之间”。这是通过反序列化渲染的,一个像素上近似一半的线,另一个像素上近似一半的线。将线条向左或向右移动0.5像素会将其移动到像素的中心,从而绕过问题

以下是一个示例:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class SharpCanvasTest extends Application {

    @Override
    public void start(Stage primaryStage) {
        Canvas sharpCanvas = createCanvasGrid(600, 300, true);
        Canvas blurryCanvas = createCanvasGrid(600, 300, false);
        VBox root = new VBox(5, sharpCanvas, blurryCanvas);
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }
    
    private Canvas createCanvasGrid(int width, int height, boolean sharp) {
        Canvas canvas = new Canvas(width, height);
        GraphicsContext gc = canvas.getGraphicsContext2D() ;
        gc.setLineWidth(1.0);
        for (double x = sharp ? 0.5 : 0.0; x < width; x+=10) {
            gc.moveTo(x, 0);
            gc.lineTo(x, height);
            gc.stroke();
        }
        
        for (double y = sharp ? 0.5 : 0.0; y < height; y+=10) {
            gc.moveTo(0, y);
            gc.lineTo(width, y);
            gc.stroke();
        }
        return canvas ;
    }

    public static void main(String[] args) {
        launch(args);
    }
}
导入javafx.application.application;
导入javafx.scene.scene;
导入javafx.scene.canvas.canvas;
导入javafx.scene.canvas.GraphicsContext;
导入javafx.scene.layout.VBox;
导入javafx.stage.stage;
公共类SharpCan扩展了最广泛的应用程序{
@凌驾
公共无效开始(阶段primaryStage){
Canvas-sharpCanvas=createCanvasGrid(600300,true);
Canvas blurryCanvas=createCanvasGrid(600300,false);
VBox根=新的VBox(5,sharpCanvas,blurryCanvas);
primaryStage.setScene(新场景(根));
primaryStage.show();
}
私有画布createCanvasGrid(整数宽度、整数高度、布尔夏普){
画布=新画布(宽度、高度);
GraphicsContext gc=canvas.getGraphicsContext2D();
gc.设置线宽(1.0);
对于(双x=尖锐?0.5:0.0;x<宽度;x+=10){
gc.moveTo(x,0);
gc.lineTo(x,高度);
gc.stroke();
}
对于(双y=尖锐?0.5:0.0;y<高度;y+=10){
gc.moveTo(0,y);
gc.lineTo(宽度,y);
gc.stroke();
}
返回画布;
}
公共静态void main(字符串[]args){
发射(args);
}
}
结果是:


使用此符号x.5中的坐标

看看我的例子:

    gc.setFill(Color.BLACK);
    gc.setLineWidth(1.0);

    gc.strokeRect(50, 100, 25.0, 25.0);
    gc.strokeRect(100.5, 100.5, 25.0, 25.0);
你会得到两个正方形,第二个是尖锐的


参考资料:

我猜这与“与坐标系的交互作用”中描述的问题相同;虽然我不知道如何在画布的上下文中解决这个问题。下面的帖子很有趣:但解决方法对我不起作用,我也不明白为什么会起作用。我刚刚发现:它解释了它是如何工作的。。。我将进行测试,如果可行,我将回答我自己的问题,发布解决方案。James_D你的解释很准确OMG为什么这不是画布文档中的第一段?谢谢你提供的信息,变化很大。嗨。我知道距离上次回复已经快4年了,但是。。。我们可以将其添加到扩展JPanel的类中吗?例如,我有一个扩展JPanel的类,我必须在JPanel的中间宽度上画5条线,一条垂直线,4条水平线。这样,我将把JPanel分成10个正方形。。。我尝试了你的解决方案,但它给了我一些错误,如“内部图形尚未初始化”。。。谢谢
    gc.setFill(Color.BLACK);
    gc.setLineWidth(1.0);

    gc.strokeRect(50, 100, 25.0, 25.0);
    gc.strokeRect(100.5, 100.5, 25.0, 25.0);