Javafx 2 圆形中的javafx布局节点

Javafx 2 圆形中的javafx布局节点,javafx-2,radial,Javafx 2,Radial,我试着做一个音量旋钮,我有这个旋钮,但我想把音量指示器放在旋钮周围,用“照亮大斑点”表示。我用Circle节点进行了尝试。我声明了一个Circle数组,将它们全部添加到组中,这样我就可以将组放置在框架中我想要的位置。我使用circle方法setTranslateX和setTranslateY放置每个圆。每个圆都有一个用于填充的径向梯度,并且不可见。 我将滑块(音量旋钮)的值映射到数组中的每个圆圈,并调用valueChanged方法以使所有圆圈低于或等于该值,并将每个圆圈设置为可见。我的组中圆圈的

我试着做一个音量旋钮,我有这个旋钮,但我想把音量指示器放在旋钮周围,用“照亮大斑点”表示。我用
Circle
节点进行了尝试。我声明了一个
Circle
数组,将它们全部添加到
组中
,这样我就可以将组放置在框架中我想要的位置。我使用
circle
方法setTranslateX和setTranslateY放置每个圆。每个
都有一个用于填充的径向梯度,并且不可见。 我将滑块(音量旋钮)的值映射到数组中的每个
圆圈
,并调用valueChanged方法以使所有
圆圈
低于或等于该值,并将每个圆圈设置为可见。我的
组中
圆圈的位置有问题。当它们都可见时,它们被完美地放置,但是当一些属性对false可见时,剩下的可见属性不会停留在它们的位置。因此,我正在寻找一种更好的设计方法。多谢各位

代码示例: 圈创建

audioSelectionValueToCircle = new HashMap<Double, Circle>(audioSelectionCircle.length);
    for (int i = 0; i < 6; i++) {
        final int count = i;
        audioSelectionCircle[count] = new Circle(15.0);
        RadialGradient rgrad = RadialGradientBuilder.create().centerX(audioSelectionCircle[count].getCenterX() - audioSelectionCircle[count].getRadius() / 5).centerY(audioSelectionCircle[count].getCenterY() - audioSelectionCircle[count].getRadius() / 5).radius(audioSelectionCircle[count].getRadius()).proportional(false).stops(new Stop(0.0, Color.WHITE), new Stop(0.3, Color.ORANGE), new Stop(1.0, Color.TRANSPARENT)).build();
        audioSelectionCircle[count].setFill(rgrad);
        audioSelectionValueToCircle.put(audioSelectionValue[count], audioSelectionCircle[count]);
        audioSelectionCircle[count].setVisible(false);
    }
圆布局

    int n = 6;
        for (int i = 0; i < n; i++) {
            final int count = i;
            double t = 2 * Math.PI * i / n;
            double x = 60 * Math.cos(t);
            double y = 60 * Math.sin(t);
            audioSelectionCircle[count].setTranslateX(x);
            audioSelectionCircle[count].setTranslateY(y);

            gAudioSelectionCircle.getChildren().add(audioSelectionCircle[count]);
//            audioSelectionCircle[count].resizeRelocate(x, y, 41, 41);
        }
int n=6;
对于(int i=0;i
旋钮行为

audioSelectionKnob.valueProperty().addListener(new ChangeListener<Number>() {

            @Override
            public void changed(ObservableValue<? extends Number> ov, Number oldVal, Number newVal) {
//                if (!audioSelectionKnob.isValueChanging()) {
//                }
                Iterator<Map.Entry<Double, Circle>> it = audioSelectionValueToCircle.entrySet().iterator();
                while(it.hasNext()) {
                    Map.Entry<Double, Circle> pairs = it.next();
                        Circle c = pairs.getValue();
                    if(pairs.getKey() >= newVal.doubleValue()) {
                        c.setVisible(true);
                    } else {
                        c.setVisible(false);
                    }
                }
            }
        });
AudioSelectionKnobl.valueProperty().addListener(新的ChangeListener()){
@凌驾
公共无效已更改(可观察值)
其余可见的一个没有停留在他们的位置

这可能是放置算法中的一个错误导致的。要进行诊断,您需要提供一个简短、简化、可编译的示例应用程序

仅修改节点的可见性属性不应以任何方式影响应用程序的布局

对于围绕一个圆布置节点,您可以看一看。时钟示例所做的是将12个节点放置在12点钟的位置,然后对节点应用旋转以将其放置到适当的位置。布局似乎与您描述的有点类似,但如果没有参考图片,则很难确定

一旦节点被正确放置,并且在中间有一个音量旋钮“滑块”,那么就可以根据滑块值调整节点的CSS样式表(类似于当前正在进行可见性调整的方式)。打开或关闭它们的样式。您不需要从组中添加或删除更多节点,布局不应仅更改应用于不同样式节点的可见性或效果


您可能想看看这个功能,它基于替换滑块行为和皮肤的旋钮滑块(尽管您需要稍微调整实现以获得所描述的效果)。

请发布一些代码(最好是a)这显示了问题在搜索引擎径向布局算法中查找这些术语
audioSelectionKnob.valueProperty().addListener(new ChangeListener<Number>() {

            @Override
            public void changed(ObservableValue<? extends Number> ov, Number oldVal, Number newVal) {
//                if (!audioSelectionKnob.isValueChanging()) {
//                }
                Iterator<Map.Entry<Double, Circle>> it = audioSelectionValueToCircle.entrySet().iterator();
                while(it.hasNext()) {
                    Map.Entry<Double, Circle> pairs = it.next();
                        Circle c = pairs.getValue();
                    if(pairs.getKey() >= newVal.doubleValue()) {
                        c.setVisible(true);
                    } else {
                        c.setVisible(false);
                    }
                }
            }
        });