我一直在进行一个项目,该项目需要使用JavaFX的Pane圈显示节点。

这是一所大学的工作,因此我不能将外部库用作JFxtras。

做一些研究后,我在stackoverflow中发现了该类。

public class CircularPane extends Pane {
    private long degreese = 0;
    private long increment;
    @Override
    protected void layoutChildren() {
        final int radius = 250;
        final double increment = 360 / getChildren().size();
        double degreese = 0;
        for (Node node : getChildren()) {
            double x = radius * Math.cos(Math.toRadians(degreese)) + getWidth() / 2;
            double y = radius * Math.sin(Math.toRadians(degreese)) + getHeight() / 2;
            layoutInArea(node, x - node.getBoundsInLocal().getWidth() / 2, y - node.getBoundsInLocal().getHeight() / 2, getWidth(), getHeight(), 0.0, HPos.LEFT, VPos.TOP);
            degreese += increment;
        }
    }
}


一开始我以为它可以正常工作,但后来我注意到了这一点。
当我将40个节点添加到窗格中时,它显示如下:
java - Java中的圆形 Pane-LMLPHP

但是,当我尝试显示41个节点时,就是这样:

java - Java中的圆形 Pane-LMLPHP

我真的不知道发生了什么,直到我发现只有当我尝试显示窗格中的n个节点并且360无法被n整除时才会出现空白。
有谁知道我该如何解决?

事前,非常感谢。

最佳答案

您将两个int除以计算角度。这会将结果截断为整数值。假设您要放置n节点,则结果可能是错误的,其值小于n-1(每个“步骤”的错误小于1)。

只需确保使用浮点除法即可。这样,结果应该更加准确:

final double increment = 360d / getChildren().size();
//                          ^ modification here


由于第一个红利是double,因此int返回的size()将自动提升为double,并且会发生浮点除法。如果不添加d后缀,则两个操作数都是int,导致上述有问题的除法。

10-07 19:12
查看更多