2012-06-12 80 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,它基於基於滑塊行爲和皮膚的替代滑塊(儘管您需要稍微調整實現以獲得所描述的效果)。