2012-06-12 79 views
0

我试图做一个音量旋钮,我已经得到了旋钮,但是我想将音量指示器放在由开光大点代表的旋钮周围。我试了一下Circle节点。我宣布了一组Circle将它们全部添加到一个Group,以便我可以将该组放在我想要的框架中。我使用Circle方法setTranslateX和setTranslateY来放置每个圆。每个Circle都有一个用于填充的径向梯度,并且不可见。 我将滑块(音量旋钮)的值映射到我的数组中的每个Circle,并调用valueChanged方法以获取所有Circle以下或等于该值并将其设置为可见。我在Group内的Circle的位置有问题。当它们全都可见时,它们被完全放置,但是当一些可见的虚假物品可见时,其余的可见物品不会停留在它们的位置。所以我正在寻找一个更好的设计方法来做到这一点。谢谢。javafx布局中的节点

代码示例: 圈创造

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);。它看起来不会保留我首先设置的旋转值。

+0

请发布一些代码(最好是[自包含的可编译的](http://sscce.org/)),它会显示问题 – Attila

+0

在搜索引擎中寻找这些条款_radial layout algorithm_ – Enrique

回答

0

其余可见一个不留在自己的位置

这可能是你的布局算法中的错误,这是造成这一点。要诊断,您需要提供一个简短的,可编译的示例应用程序。

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

对于围绕一个圆圈放置节点,你可以看看这个clock sample。时钟样本所做的是在12点钟位置放置12个节点,然后向节点施加旋转以使其到达适当的位置。布局看起来有点类似于你所描述的,尽管没有参考图片很难确定。

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

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