0

我正在尝试做一个音量旋钮,我有旋钮,但我想在旋钮周围放置音量指示器,由启迪大点表示。Circle我用节点试了一下。我声明了一个Circle将它们全部添加到 a的数组,Group以便我可以将组放置在框架中我想要的位置。Circle我使用setTranslateX 和 setTranslateY 方法放置每个圆圈。每个Circle都有用于填充的径向渐变,并且不可见。我将滑块(音量旋钮)的值映射到Circle数组中的每个值,并调用 valueChanged 方法以获取所有Circle低于或等于该值的值并将它们中的每一个设置为可见。Circle我的内部位置有问题Group. 当它们都可见时,它们就被完美地放置了,但是当它们的属性变为 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);
    }

组创建

    gAudioSelectionCircle = new Group();
gAudioSelectionCircle.resizeRelocate(1225, 520, 280, 280);
        gAudioSelectionCircle.setRotate(90);

圆圈放置

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

旋钮行为

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

也许一件事,如果我在我的旋钮上方添加组是一个问题吗?我将旋钮添加到根组,并将圆形组添加到旋钮上方的根组。


我部分解决了将采样时钟的旋转方法应用于我的圆圈的问题。但是,当我使用group.setRotate(rotation);. 当我所有的圆圈都可见时,圆圈的位置很好,但是当我开始更改可见属性时,通过滑动旋钮,该组的行为就像我做了一样group.setRotation(0);。看起来它没有保留我首先设置的旋转值。

4

1 回答 1

0

其余可见的没有停留在他们的位置

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

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

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

正确放置节点后,您的音量旋钮“滑块”位于中间,然后您可以根据滑块值(类似于您当前进行可见性调整的方式)调整节点的 css 样式类以设置样式他们打开或关闭。您永远不需要从组中添加或删除更多节点,并且布局不应仅更改应用于不同样式节点的可见性或效果。

You might want to look at this audio player example which features knob based sliders based on replacing the slider behaviour and skin (though you would need to tweak the implementation a bit to get the kind of effect you are describing).

于 2012-06-12T21:48:14.477 回答