2016-07-01 168 views
0

我創建了一個ListView,它根據對象字段動態繪製一個特定顏色的圓。單元格可以有三個狀態,導出,具有必填信息,也沒有。前兩個他們有自己的圓圈顏色,我想「沒有任何一個」來實現他們的圖形兩個圓圈。問題是你只能爲單元格設置一個圖形。如何創建一個帶有兩個圓圈的形狀?

我試圖找到一種解決方法,通過改變圓的的centerX和他們兩個用Shape.union,但只顯示circEx。有什麼辦法可以實現這個嗎?

listView.setCellFactory(new Callback<ListView<BusinessCard>, ListCell<BusinessCard>>(){ 
        @Override 
        public ListCell<BusinessCard> call(ListView<BusinessCard> list){ 
         return new ColorCell(); 
        } 
}); 



//Colors circled that indicates status of card on listView 
static class ColorCell extends ListCell<BusinessCard> { 
    @Override 
    public void updateItem(BusinessCard item, boolean empty) { 
     super.updateItem(item, empty); 

     //Probably should have one circle and setFil in if statements 
     Circle circMan = new Circle(0,0,3,Color.web("#ff9999")); 
     Circle circEx = new Circle(10,0,3,Color.web("#808080")); // old #e1eaea 
     Circle circDone = new Circle(0,0,3,Color.web("#99ff99")); //old #99ff99  

     if(item != null){ 
      setTextFill(Color.BLACK); 
      setText(item.toString()); 

      if(item.wasExported() && !item.hasMand()){ 
       setGraphic(Shape.union(circMan, circEx)); //TODO 
      }    
      else if(item.wasExported()){ 
       setGraphic(circEx); 
      }    
      else if(!item.hasMand()){ 
       setGraphic(circMan); 
      } 
      else{ 
       setGraphic(circDone); 
      } 
     } 
    } 
} 
+0

你能製作一個半圈的顏色嗎? – trashgod

+0

嗯,我,看看我是否能有兩個圓弧,並創建兩個聯盟之間的形狀雖然我想這兩個圓我想這將不得不這樣做。 – Javant

回答

0

可以使用Pane作爲graphic,例如HBox

而且你可能不應該一遍遍在updateItem方法重新創建的圈子。

static class ColorCell extends ListCell<BusinessCard> { 

    private final Circle manDone = new Circle(3); 
    private final Circle ex = new Circle(3); 
    private final HBox circles = new HBox(4, manDone, ex); 

    private static final Color EXPORTED_COLOR = Color.web("#808080"); 
    private static final Color MAN_COLOR = Color.web("#ff9999"); 
    private static final Color DONE_COLOR = Color.web("#99ff99"); 

    { 
     setGraphic(circles); 

     // hide circles 
     manDone.setFill(Color.TRANSPARENT); 
     ex.setFill(Color.TRANSPARENT); 

     setTextFill(Color.BLACK); 
    } 

    @Override 
    public void updateItem(BusinessCard item, boolean empty) { 
     super.updateItem(item, empty); 

     if (item == null) { 
      // hide circles 
      manDone.setFill(Color.TRANSPARENT); 
      ex.setFill(Color.TRANSPARENT); 

      setText(null); 
     } else { 
      setText(item.toString()); 

      ex.setFill(item.wasExported() ? EXPORTED_COLOR : Color.TRANSPARENT); 
      manDone.setFill(item.hasMand() 
           ? (item.wasExported() ? DONE_COLOR : Color.TRANSPARENT) 
           : MAN_COLOR); 
     } 
    } 
}