【问题标题】:Javafx Labeled labelPaddingProperty - Adding triangles in the upper left or right cornersJavafx Labeled labelPaddingProperty - 在左上角或右上角添加三角形
【发布时间】:2017-03-17 23:48:00
【问题描述】:

我正在尝试像 Excel 一样在 Labeled(实际上是 TableCell)的左上角或右上角绘制一个三角形。 JavaFX labelPadding 文档说:

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

因此,我认为我可以将样式设置为顶部 10px,然后将多边形添加到标签中,但是当填充起作用时,多边形不会绘制。例如,如果我将它插入到场景中,我希望在 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,我试图不为每个单元格创建一个复合对象。

谢谢

【问题讨论】:

    标签: javafx


    【解决方案1】:

    这是由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, ""));
        }
    
    }
    

    【讨论】:

    • 感谢您的帮助。我发现我必须向 Excelcell:updateItem 中调用的 ExcellCellSkin 添加一个修复方法以重新添加 Polygon,因为它似乎在将行添加到表时和其他时间被删除了。但是由于在调用 updateItem 时皮肤并不总是建立,因此如果 getSkin 为空,我还使用了 setSkin(createDefaultSkin)。再次感谢!!!!
    猜你喜欢
    • 2013-05-10
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多