如何创建一个包含两个圆圈的形状?

时间:2016-07-01 14:11:59

标签: java javafx

我创建了一个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);
             }
        }
    }
}

1 个答案:

答案 0 :(得分: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);
        }
    }
}