当前位置: 首页 > 知识库问答 >
问题:

Javafx形状错位

梁烨
2023-03-14

我对javafx中的形状错位有问题。我使用的是javafx.scene.shape。使用Shape进行一些计算。当我像下面的第一个代码一样将所有形状放在一起时,一切都很好。但在我的扩展程序中,我的想法是动态地将形状添加到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);
}

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);

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

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

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);
    }
}

这段代码只显示了我较大代码的简化版本,但阐明了我的问题复杂的方式,我认为我这样做的方式可能不是最好的。我希望得到您的想法,使其正常工作。感谢您未来的评论和答案。

[编辑]我的简单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>

当我将锚点窗格更改为窗格时,没有任何变化。

共有1个答案

苏阳州
2023-03-14

如果要查看形状的详细信息及其位置,可以使用系统.out.println(结果形状)在控制台中打印出来。

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

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

当您尝试在向锚点添加圆后获取resultShape时,将使用displayPane.getChildren()已转换的值计算其位置。add(),这将是一个很好的位置。不幸的是,将resultShape添加到主播会再次移动它-它会“两次”移位。

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

1)将resultShape添加到主anchor pane(display pane的父级)-您将避免第二次移位。

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

3)如果layoutX和layoutY不是必需的,就去掉它们。

希望这会有所帮助。

 类似资料:
  • 我在一个板上有几个对象,我想通过坐标获取这些对象的索引。我尝试过制作一个处理程序,并使用与相结合,但没有成功。这些方法给了我不同的坐标,无法匹配它们。 我是否应该用光标的坐标画一个矩形,并使用< code > getBoundInParent()。intersects方法? 有什么建议吗?

  • 我目前正在使用JavaFX研究不同形状之间的边界相交。我想检测两个多边形在它们的点上的碰撞,而不是在它们的边界上(即2个多边形)。 请参阅图1:不期望的行为,以及图2:期望的行为。 是否有任何现有的算法可以帮助我或使用任何库?提前感谢:) 在这里找到我的解决方案: 输出: 它似乎工作正常,我将使用Path对象进行测试以替换多边形objets。

  • 我正在用JavaFX制作一个2D游戏,当检测到冲突时,我得到的结果相当不准确,因为玩家精灵被设置为矩形的填充,因此没有预期的边框。有没有办法让我自己的形状尽可能准确? 我的另一个想法是检查碰撞的像素是否透明,然后如果它是,则不会结束游戏。有谁知道一种方法可以获得碰撞像素的坐标,以便从那里我可以使用PixelReader进行检查? 如果有人知道更好的方法,请告诉我! 谢谢,伊森

  • 我不是JavaFX的资深程序员,想请教一下。如何在JavaFX中为按钮制作或设置不同的形状?默认情况下,按钮具有这些圆角矩形形状。我想做一个按钮形状像下面的图片,一个L形按钮。 我已经谷歌了这个话题很多次,但仍然没有找到解决办法。 你能帮助我吗?

  • 我有一个网格窗格的圆圈,我希望能够将一个圆圈拖到另一个圆圈之上,并将第一个圆圈的颜色应用于第二个圆圈。 我遇到的问题是,我无法让目标圆检测到dragEntered或dragOver。我已经能够使用标签成功地实现这一点,但由于某些原因,圆圈不会产生相同的效果。 我见过一些准解决方案,涉及设置circle.setMouseTransparent(true),以便被拖动节点下的节点可以看到拖动,但这里也

  • 我是新来的,所以任何帮助都是值得的,这段代码是我的教授给我的,当我问一个例子,我希望有一个工作模型。。。 读取数据 将行走状态定义为0,运行状态定义为1 随机选取50%的数据作为测试数据,其余数据作为列车数据 使用skLearning选择50%的功能 应用支持向量机算法 回溯(最近一次调用):文件“”,第1行,在execfile exec(compile(f.read)()第89行的文件“C:\U