Javafx 2 什么是线';javafx2中的精确尺寸是多少?

Javafx 2 什么是线';javafx2中的精确尺寸是多少?,javafx-2,Javafx 2,我想知道JavaFX2.1中一行的确切宽度 创建从点(10;10)开始到点(20;10)结束的直线的预期宽度应为10px。读取线宽时,返回11px的值。 当开始附加的示例并制作一个屏幕截图时,您将看到-在更高的缩放级别-线条的宽度为12px,高度为2px 使用LineBuilder没有任何区别。我尝试应用不同的StrokeType,但未成功 创建边长为10的正方形将返回10px的预期宽度 为什么line.getBoundsInLocal().getWidth()返回的值与我在渲染结果(屏幕截图)

我想知道JavaFX2.1中一行的确切宽度

创建从点(10;10)开始到点(20;10)结束的直线的预期宽度应为10px。读取线宽时,返回11px的值。 当开始附加的示例并制作一个屏幕截图时,您将看到-在更高的缩放级别-线条的宽度为12px,高度为2px

使用
LineBuilder
没有任何区别。我尝试应用不同的
StrokeType
,但未成功

创建边长为10的正方形将返回10px的预期宽度

  • 为什么
    line.getBoundsInLocal().getWidth()
    返回的值与我在渲染结果(屏幕截图)中看到的值不同
  • 为什么在创建直线和多边形时,宽度会有差异
  • 示例:

    import javafx.application.Application;
    import javafx.scene.Group;
    import javafx.scene.Scene;
    import javafx.scene.shape.Line;
    import javafx.scene.shape.Polygon;
    import javafx.stage.Stage;
    
    public class ShapeWidthDemo extends Application {
        @Override
        public void start(Stage stage) throws Exception {
            Group root = new Group();
    
            int startX = 10;
            int startY = 10;
            int length = 10;
    
            Line line = new Line(startX, startY, startX + length, startY);
            System.out.println("line width: " + line.getBoundsInLocal().getWidth());
            //->line width: 11.0
            System.out.println("line height: " + line.getBoundsInLocal().getHeight());
            //->line height: 1.0
            root.getChildren().add(line);
    
            int startY2 = startY + 2;
    
            Polygon polygon = new Polygon(
                startX, startY2,
                startX + 10, startY2, 
                startX + 10, startY2 + 10, 
                startX, startY2 + 10);
            System.out.println("polygon width: " + polygon.getBoundsInLocal().getWidth());
            //->polygon width: 10.0
            System.out.println("polygon height: " + polygon.getBoundsInLocal().getHeight());
            //->polygon height: 10.0
            root.getChildren().add(polygon);
    
            stage.setScene(new Scene(root, 100, 100));
            stage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    
    1) 生产线的终点由
    StrokeLineCap
    控制
    因此,使用默认笔划宽度,您可以通过

    line.setStrokeType(StrokeType.CENTERED);
    line.setStrokeLineCap(StrokeLineCap.BUTT);
    
    如果应用了
    StrokeType.OUTSIDE
    和NOT
    StrokeLineCap.BUTT
    ,则可以获得这些值。但是,即使更改笔划属性,高度仍保持在2px。真奇怪


    2) 默认情况下,由于多边形的笔划值而导致的笔划值为空。通过像
    polygon.setStroke(Color.RED)那样设置它笔划将渲染

    把线本身想象成没有任何表面积,它是无限薄的。线条的唯一尺寸来自笔划

    当StrokeType为且StrokeLineCap为(默认值)时,线条所占据的面积来自于在所有方向上围绕线条均匀应用一半笔划宽度

    在您的示例中,您正在整数坐标处绘制一条笔划为1的水平线。JavaFX使得整数角映射到像素之间的线。当显示具有整数坐标的水平线时,该线本身穿过该线两侧两个垂直像素的一半,并最终成为灰色着色的抗锯齿线,而不是仅着色一个垂直像素的黑线。此外,应用于线条端点的方形笔划线帽意味着笔划超出线条端点一半的笔划宽度。这将使线条两端两侧的两对像素中每个像素的四分之一着色

    通过将直线的坐标偏移半个像素,可以绘制直线,使其对一行垂直像素进行着色,因为现在直线沿每个像素的中间下降,直线笔划延伸到每个像素的上边缘和下边缘。此外,将线帽设置为对接而不是方形意味着线的阴影区域不会延伸到线的端点之外

    下面是一些示例代码来演示这一点。在示例中,只有最后一行完全着色,仅为10个像素,不超过10个像素。它也是唯一一条宽度为10且在其边界框中具有整数坐标的线

    import javafx.application.Application;
    import javafx.scene.Group;
    import javafx.scene.Scene;
    import javafx.scene.shape.Line;
    import javafx.scene.shape.StrokeLineCap;
    import javafx.stage.Stage;
    
    public class LineBounds extends Application {
      public static void main(String[] args) { launch(args); }
      @Override public void start(Stage stage) throws Exception {
        double startX = 10;
        double startY = 10;
        double length = 10;
    
        Line lineSpanningPixelsSquareEnd = new Line(startX, startY, startX + length, startY);
        System.out.println("lineSpanningPixels (square) bounding box: " + lineSpanningPixelsSquareEnd.getBoundsInLocal());
    
        startX = 10;
        startY = 20;
        length = 10;
    
        Line lineSpanningPixelsButtEnd = new Line(startX, startY, startX + length, startY);
        lineSpanningPixelsButtEnd.setStrokeLineCap(StrokeLineCap.BUTT);
        System.out.println("lineSpanningPixels (butt) bounding box:   " + lineSpanningPixelsButtEnd.getBoundsInLocal());
    
        startX = 10;
        startY = 29.5;
        length = 10;
    
        Line lineOnPixelsSquareEnd = new Line(startX, startY, startX + length, startY);
        System.out.println("lineOnPixels (square) bounding box:       " + lineOnPixelsSquareEnd.getBoundsInLocal());
    
        startX = 10;
        startY = 39.5;
        length = 10;
    
        Line lineOnPixelsButtEnd = new Line(startX, startY, startX + length, startY);
        lineOnPixelsButtEnd.setStrokeLineCap(StrokeLineCap.BUTT);
        System.out.println("lineOnPixels (butt) bounding box:         " + lineOnPixelsButtEnd.getBoundsInLocal());
    
        stage.setScene(
          new Scene(
            new Group(
              lineSpanningPixelsSquareEnd, lineSpanningPixelsButtEnd, lineOnPixelsSquareEnd, lineOnPixelsButtEnd
            ), 100, 100
          )
        );
        stage.show();
      }
    }
    
    示例程序的输出为:

    lineSpanningPixels (square) bounding box: BoundingBox [minX:9.5, minY:9.5, minZ:0.0, width:11.0, height:1.0, depth:0.0, maxX:20.5, maxY:10.5, maxZ:0.0]
    lineSpanningPixels (butt) bounding box:   BoundingBox [minX:10.0, minY:19.5, minZ:0.0, width:10.0, height:1.0, depth:0.0, maxX:20.0, maxY:20.5, maxZ:0.0]
    lineOnPixels (square) bounding box:       BoundingBox [minX:9.5, minY:29.0, minZ:0.0, width:11.0, height:1.0, depth:0.0, maxX:20.5, maxY:30.0, maxZ:0.0]
    lineOnPixels (butt) bounding box:         BoundingBox [minX:10.0, minY:39.0, minZ:0.0, width:10.0, height:1.0, depth:0.0, maxX:20.0, maxY:40.0, maxZ:0.0]
    

    好的,应用
    StrokeLineCap.BUTT
    可以得到预期的线宽。谢谢通过放大屏幕截图来确定形状的真实尺寸是一个有效的选择。这样做会显示2px的线条高度。我不明白,为什么
    line.getBoundsInLocal().getHeight()
    和渲染结果之间有1px的差异。默认笔划类型值为
    StrokeType.CENTERED
    。另请参见相关问题:
    lineSpanningPixels (square) bounding box: BoundingBox [minX:9.5, minY:9.5, minZ:0.0, width:11.0, height:1.0, depth:0.0, maxX:20.5, maxY:10.5, maxZ:0.0]
    lineSpanningPixels (butt) bounding box:   BoundingBox [minX:10.0, minY:19.5, minZ:0.0, width:10.0, height:1.0, depth:0.0, maxX:20.0, maxY:20.5, maxZ:0.0]
    lineOnPixels (square) bounding box:       BoundingBox [minX:9.5, minY:29.0, minZ:0.0, width:11.0, height:1.0, depth:0.0, maxX:20.5, maxY:30.0, maxZ:0.0]
    lineOnPixels (butt) bounding box:         BoundingBox [minX:10.0, minY:39.0, minZ:0.0, width:10.0, height:1.0, depth:0.0, maxX:20.0, maxY:40.0, maxZ:0.0]