2017-03-17 261 views
0

我试图在Excel的标签(真的是TableCell)的左上角或右上角画一个三角形。 JavaFX labelPadding文档说:Javafx Labeled labelPaddingProperty - 在左上角或右上角添加三角形

Labeled的文本和图形内容周围的填充。默认情况下,labelPadding是Insets.EMPTY,不能设置为null。 子类可以在此填充之外和Labeled的填充内添加节点。此属性只能从CSS设置。

因此,我认为我可以在上面设置样式为10px,然后将多边形添加到标签,但是在填充工作时,多边形不绘制。例如,如果我插入这个场景我希望得到上述喂一粉角:

public class JxLabeled extends Labeled { 
    public JxLabeled() { 
     setText("Hello"); 
     Polygon polygon = new Polygon(); 
     polygon.getPoints().addAll(new Double[]{ 
       0.0, 0.0, 10.0, 0.0, 0.0, 10.0 }); 
     polygon.setFill(Color.PINK); 
     getChildren().add(polygon); 
     setStyle("-fx-label-padding: 10 0 0 0;"); 
    } 
} 

应该在哪里添加的多边形节点任何想法基于上述文档吗?

PS-我意识到我可以创建一个Group或StackedPane来做到这一点,但由于我在TableView中使用它并重写TableCell,我试图不为每个单元格创建一个复合对象。

THX

回答

0

这是由方式TableCell引起初始化它的内容。

TableCell延伸Control因此,当第一次布局过程中发生皮肤初始化时添加子项。 TableCellSkin取代现有子女,因此将您的Polygon从子女名单中删除。

你需要使用自己的皮肤来防止这种情况。 (注意:TableCellSkincom.sun包的一部分):

public class ExcelCellSkin<S, T> extends TableCellSkin<S, T> { 

    private final Polygon polygon; 

    public ExcelCellSkin(TableCell<S, T> tableCell) { 
     super(tableCell); 

     this.polygon = new Polygon(0.0, 0.0, 10.0, 0.0, 0.0, 10.0); 
     polygon.setFill(Color.PINK); 
     this.polygon.setManaged(false); 
     getChildren().add(polygon); 
    } 

} 
public class ExcelCell<S, T> extends TableCell<S, T> { 

    { 
     setStyle("-fx-label-padding: 0 0 0 10;"); 
    } 

    @Override 
    protected Skin<?> createDefaultSkin() { 
     return new ExcelCellSkin<>(this); 
    } 

    @Override 
    protected void updateItem(T item, boolean empty) { 
     super.updateItem(item, empty); 

     setText(Objects.toString(item, "")); 
    } 

} 
+0

感谢你的帮助。我发现我必须将修复方法添加到在Excelcell中调用的ExcellCellSkin中:updateItem重新添加多边形,因为它似乎在将行添加到表和其他时间时被删除。但是因为皮肤并不总是在updateItem被调用时建立的,所以如果getSkin为null,我也使用了setSkin(createDefaultSkin)。再次感谢!!!! – JLK