Java中的圆形窗格

Jor*_*ega 0 java javafx

我一直在进行一个项目,该项目需要使用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;
        }
    }  
}
Run Code Online (Sandbox Code Playgroud)

一开始我以为它可以正常工作,但后来我注意到了这一点。当我在窗格中添加40个节点时,它显示如下: 在此处输入图片说明

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

在此处输入图片说明

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

事前,非常感谢。

fab*_*ian 9

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

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

final double increment = 360d / getChildren().size();
//                          ^ modification here
Run Code Online (Sandbox Code Playgroud)

由于第一个股利是a,double因此intsize()自动将提现为,double并且会发生浮点除法。如果不添加d后缀,则两个操作数均为ints,从而导致上述有问题的除法。