我试图像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
答案 0 :(得分:0)
这是由TableCell
初始化内容的方式引起的。
TableCell
扩展Control
,因此在第一次布局过程中初始化皮肤时会添加子项。 TableCellSkin
替换现有子项,因此会从子列表中删除Polygon
。
你需要使用自己的皮肤来防止这种情况发生。 (请注意TableCellSkin
是com.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, ""));
}
}