如何在JavaFX LineChart中的NumberAxis上保持相等的x和y长度?

时间:2019-04-11 21:55:53

标签: java javafx linechart

我正在使用NumberAxis创建一个笛卡尔坐标图,以在LineChart中创建一个x和y轴,并使用getDisplayPosition查找沿x轴的两个点和沿y轴的两个点之间的距离。 差异并不相等

我用相同的tickUnit设置将x和y轴的上下边界设置为相同。从外观上看,网格在所有方向上看起来都是正方形且相等,但是我似乎无法使它们完全相等。

这是我在线图中设置x和y的NumberAxis的方式:

xAxis.setLowerBound(-2.4);
xAxis.setUpperBound(2.4);
xAxis.setTickUnit(.1);
xAxis.setSide(Side.BOTTOM);
xAxis.setAutoRanging(false);

yAxis.setLowerBound(-2.4);
yAxis.setUpperBound(2.4);
yAxis.setTickUnit(.1);
yAxis.setSide(Side.LEFT);
yAxis.setAutoRanging(false);

LineChart linechart = new LineChart<Number,Number>(xAxis, yAxis);

这是我如何转换输入以使矩形正确显示

private Rectangle calcRectangle(SectionRectangle rectangle){
        double xPosition = xAxis.getDisplayPosition(rectangle.getXorigin()); 
        double yPosition = yAxis.getDisplayPosition(rectangle.getYorigin());
        double xCoord = xPosition + chartZeroX;//x origin of rectangle 
        double yCoord = yPosition + chartZeroY;//y origin of rectangle

        double width = rectangle.getXorigin() + rectangle.getWidth();

        double widthPosition = xAxis.getDisplayPosition(width);
        double heightPosition = yAxis.getDisplayPosition(rectangle.getYorigin() + rectangle.getHeight());

        Rectangle calculatedRectangle = new Rectangle(xCoord, yCoord - (yPosition - heightPosition), widthPosition - xPosition, yPosition - heightPosition);

        calculatedRectangle.setFill(Color.TRANSPARENT);

        Rotate rotate = new Rotate();
        rotate.setAngle(360 - rectangle.getRotation());
        rotate.setPivotX(xPosition + chartZeroX);
        rotate.setPivotY(yPosition + chartZeroY);
        calculatedRectangle.getTransforms().add(rotate);
        calculatedRectangle.setStroke(Color.BLACK);

        return calculatedRectangle;

这是我将形状添加到图形上的方法

Pane chartContent = (Pane) linechart.lookup(".chart-content");
Rectangle rectangle = calcRectangle(rectangleData);
chartContent.getChildren().add(rectangle);

不旋转,矩形将按预期显示,但是由于像素宽度与像素高度的细微差异,旋转90度会导致矩形的尺寸要比宽的尺寸高。

这是该问题的更精确示例

double xdiff = xAxis.getDisplayPosition(1) - xAxis.getDisplayPosition(0);
double ydiff = yAxis.getDisplayPosition(0) - yAxis.getDisplayPosition(1);

此处xdiff = 195.208,ydiff = 191.041

希望通过某种方式强制x和y轴保持精确相等的距离。

1 个答案:

答案 0 :(得分:0)

我通过控制折线图的高度和宽度解决了自己的问题:

linegraph.setPrefHeight(850);
linegraph.setMinHeight(850);
linegraph.setMaxHeight(850);
linegraph.setMinWidth(853);
linegraph.setMaxWidth(853);
linegraph.setPrefWidth(853);
linegraph.setPrefSize(853, 850);
linegraph.setMinSize(853, 850);
linegraph.setMaxSize(853, 850);

我使用以下方法检查了x = 0,x = 1和y = 0,y = 1之间的距离:

double xlength = xAxis.getDisplayPosition(1) - xAxis.getDisplayPosition(0);
double ylength = yAxis.getDisplayPosition(0) - yAxis.getDisplayPosition(1);

我慢慢增加宽度,直到两个长度相等。