Javafx型位错

Javafx型位错,java,javafx,shapes,Java,Javafx,Shapes,我在javafx中遇到了形状错位的问题。 我正在使用javafx.scene.shape.shape对形状进行一些计算。当我把所有形状像下面的第一个代码一样放在一起时,一切都很好。但在我的扩展程序中,我的想法是动态地向AnchorPane添加形状(如果它能帮助我使用其他类型的窗格)。我在下面粘贴了第二个代码,显示了形状错位 第一个代码(良好结果): 第二个代码(错误结果): 这段代码只显示了我的大代码的简化版本,但以复杂的方式说明了我的问题, 我认为我现在的方式可能不是最好的。我想听听你的想法,

我在javafx中遇到了形状错位的问题。 我正在使用javafx.scene.shape.shape对形状进行一些计算。当我把所有形状像下面的第一个代码一样放在一起时,一切都很好。但在我的扩展程序中,我的想法是动态地向AnchorPane添加形状(如果它能帮助我使用其他类型的窗格)。我在下面粘贴了第二个代码,显示了形状错位

第一个代码(良好结果):

第二个代码(错误结果):

这段代码只显示了我的大代码的简化版本,但以复杂的方式说明了我的问题, 我认为我现在的方式可能不是最好的。我想听听你的想法,让它正常工作。 感谢您以后的评论和回答

[编辑] 我的简单fxml:

<AnchorPane fx:controller="sample.Controller"
        xmlns:fx="http://javafx.com/fxml" prefHeight="720" prefWidth="1280">
<children>
    <AnchorPane fx:id="displayPane" layoutX="60.0" layoutY="60.0" prefHeight="600.0" prefWidth="600.0" />
</children>


当我将Ancorpane更改为Pane时,没有任何更改。

如果您想查看形状及其位置的详细信息,可以在控制台中使用System.out.println(resultShape)打印出来

在对两个版本执行此操作后,您会注意到错误的版本在X轴上移位了60.0,在Y轴上移位了相同的值。只有在圆后添加结果形状时才会发生这种情况,这是由锚平面中的layoutX和layoutY值引起的

圆的中心设置为特定值。如果在将它们添加到窗格之前将它们相交,则将使用这些值计算结果形状的位置。在此之后,displayPane.getChildren().add()将只转换所有三个对象一次-这是预期的结果

在将圆添加到锚平面后尝试获取resultShape时,将使用displayPane.getChildren().add()已转换的值计算其位置,这将是一个很好的位置。不幸的是,将结果形状添加到锚烷中会再次移动它——它将“两次”移位

有一些方法可以解决此问题:

1) 将resultShape添加到主锚链烷(displayPane的父级)-您将避免第二次移位

2) 在将圆添加到displayPane之前将它们相交(就像在第一个版本的代码中一样)-所有对象将只转换一次

3) 如果没有必要的话,就去掉layoutX和layoutY


希望这会有所帮助。

AnchorPane对其内容进行了一些布局,因此它会以某种方式移动形状。您没有使用
锚网
的任何布局功能(即锚网),因此只需使用普通的
窗格
。(我真的不明白为什么这段代码不只是抛出空指针异常,因为
displayPane
从未初始化过。)displayPane是在fxml中初始化的,很抱歉我没有注意到这一点。如果您遵循标准实践,并将所有字段
设置为私有的
,然后您需要对它们进行注释
@FXML
,这将使任何阅读代码的人都能清楚地看到这种情况。感谢您的建议,Jamesi如果您将AnchorPane中的layoutX和layoutY设置为0.0,那么这两个代码片段将得到相同的结果。只有一个区别。结果形状将出现在前面的第二个片段中,因为您将其添加到结尾的AnchorPane中。
public class Controller {
    public AnchorPane displayPane;

    public Circle circleA = new Circle();
    public Circle circleB = new Circle();
    public Shape resultShape;

    public void initialize() {
        setupShapes();
        displayPane.getChildren().add(circleA);
        displayPane.getChildren().add(circleB);

        resultShape = Shape.intersect(circleA, circleB);
        resultShape.setFill(Color.DEEPSKYBLUE);
        displayPane.getChildren().add(resultShape);
    }

    public void setupShapes() {
        double d = 100;
        double x = Math.sqrt(3 * Math.pow(d, 2) / 4);

        circleA.setCenterX(300.0);
        circleA.setCenterY(300.0 - d);
        circleA.setRadius(150);
        circleA.setFill(Color.TRANSPARENT);
        circleA.setStroke(Color.BLACK);
        circleA.setStrokeWidth(2);

        circleB.setCenterX(300.0 + x);
        circleB.setCenterY(300.0 + d / 2);
        circleB.setRadius(150);
        circleB.setFill(Color.TRANSPARENT);
        circleB.setStroke(Color.BLACK);
        circleB.setStrokeWidth(2);
    }
}
<AnchorPane fx:controller="sample.Controller"
        xmlns:fx="http://javafx.com/fxml" prefHeight="720" prefWidth="1280">
<children>
    <AnchorPane fx:id="displayPane" layoutX="60.0" layoutY="60.0" prefHeight="600.0" prefWidth="600.0" />
</children>