JavaFX线段宽度

时间:2015-04-25 14:55:27

标签: java javafx 2d line

我有一些代码可以响应按键,并相应地绘制点和线段。但是,尽管我没有触及代码中的线条笔划宽度,但线段的宽度似乎是交替的。我想知道为什么会这样。

以下是代码:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.scene.shape.Line;

public class DrawLineSegments extends Application {

    static double x = 0.0;
    static double y = 0.0;

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

    @Override
    public void start(Stage primaryStage) throws Exception {

        Pane p = new Pane();

        Rectangle border = new Rectangle(0, 0, 300, 100);
        border.setFill(Color.TRANSPARENT);
        Rectangle initialPoint = new Rectangle(border.getWidth() / 2, border.getHeight() / 2, 2, 2);
        initialPoint.setFill(Color.BLACK);

        x = border.getWidth() / 2;
        y = border.getHeight() / 2;

        p.getChildren().addAll(border, initialPoint);

        p.setOnKeyPressed(e -> {

            switch (e.getCode()) {

            case UP : 
                Line upLine = new Line(x + 1, y + 1, x + 1, y + 1 - 7.5);
                y = y - 7.5;
                upLine.setStroke(Color.BLUEVIOLET);
                upLine.setFill(Color.SANDYBROWN);
                p.getChildren().add(upLine);
                p.getChildren().add(new Rectangle(x, y, 2, 2));
                break;

            case DOWN : 
                Line downLine = new Line(x + 1, y + 1, x + 1, y + 1 + 7.5);
                y = y + 7.5;
                downLine.setStroke(Color.BLUEVIOLET);
                downLine.setFill(Color.SANDYBROWN);
                p.getChildren().add(downLine);
                p.getChildren().add(new Rectangle(x, y, 2, 2));
                break;

            case LEFT : 
                Line leftLine = new Line(x - 7.5, y + 1, x + 1, y + 1);
                x = x - 7.5;
                leftLine.setStroke(Color.BLUEVIOLET);
                leftLine.setFill(Color.SANDYBROWN);
                p.getChildren().add(leftLine);
                p.getChildren().add(new Rectangle(x, y, 2, 2));
                break;

            case RIGHT : 
                Line rightLine = new Line(x + 7.5, y + 1, x + 1, y + 1);
                x = x + 7.5;
                rightLine.setStroke(Color.BLUEVIOLET);
                rightLine.setFill(Color.SANDYBROWN);
                p.getChildren().add(rightLine);
                p.getChildren().add(new Rectangle(x, y, 2, 2));
                break;

            default:
                break;
            }
        });

        Scene scene = new Scene(p);

        primaryStage.setScene(scene);
        primaryStage.setTitle("Draw Line Segments");
        primaryStage.show();

        p.requestFocus();

    }

}

这张图片可能更好地解释了我的要求:

enter image description here

1 个答案:

答案 0 :(得分:1)

您可能需要阅读Coordinate System of a Node

  

协调系统

     

Node类定义了传统的计算机图形“本地”   x轴向右和y增加的坐标系   轴向下增加。形状的具体节点类提供   用于定义形状的几何和位置的变量   这个局部坐标空间。例如,Rectangle提供x,y,   宽度,高度变量,而Circle提供centerX,centerY和   半径。

     

在设备像素级别,整数坐标映射到角落   像素和像素中心之间的裂缝出现在   整数像素位置之间的中点。因为所有的坐标   值用浮点数指定,坐标可以   精确指向这些角(当浮点值有   精确整数值)或像素上的任何位置。例如,a   坐标(0.5,0.5)将指向左上角的中心   舞台上的像素。类似地,在(0,0)处具有尺寸的矩形   10乘10将跨越左上角的左上角   舞台上的像素位于第10个像素的右下角   第10条扫描线。那个里面最后一个像素的像素中心   矩形位于坐标处(9.5,9.5)。

关于您的问题:请勿使用7.5。而是使用7或8.