我一直在进行一个项目,该项目需要使用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个节点添加到窗格中时,它显示如下:
但是,当我尝试显示41个节点时,就是这样:
我真的不知道发生了什么,直到我发现只有当我尝试显示窗格中的n个节点并且360无法被n整除时才会出现空白。
有谁知道我该如何解决?
事前,非常感谢。
最佳答案
您将两个int
除以计算角度。这会将结果截断为整数值。假设您要放置n
节点,则结果可能是错误的,其值小于n-1
(每个“步骤”的错误小于1)。
只需确保使用浮点除法即可。这样,结果应该更加准确:
final double increment = 360d / getChildren().size();
// ^ modification here
由于第一个红利是
double
,因此int
返回的size()
将自动提升为double
,并且会发生浮点除法。如果不添加d
后缀,则两个操作数都是int
,导致上述有问题的除法。