Javafx Labeled labelPaddingProperty - 在左上角或右上角添加三角形

时间:2017-03-17 23:48:00

标签: javafx

我试图像Excel那样在Labeled(真正的TableCell)的左上角或右上角画一个三角形。 JavaFX labelPadding文档说:

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

因此我认为我可以将样式设置为10px在顶部,然后将Polygon添加到Labeled,但是当填充工作时,Polygon不会绘制。例如,如果我将其插入到场景中,我希望在Hello上方得到一个粉红色的角落:

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;");
    }
}

根据上述文档应该添加Polygon节点的任何想法?

PS-我意识到我可以创建一个Group或StackedPane来执行此操作,但由于我在TableView中使用它并覆盖TableCell,我试图不为每个单元格创建复合对象。

THX

1 个答案:

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

}