繁体   English   中英

JavaFX TreeTableView图像伪像

[英]JavaFX TreeTableView Image artefacts

我想将图像添加到TreeTableView中的每个节点。 为了做到这一点,我写了(根据在Google上找到的某些页面)以下内容:

调用以更新视图控制器中的视图

public void refreshView() {
    final List<TreeItem<IUnit>> treeItems = new ArrayList();
    final Collection<IUnit> onRootLevel = source.getUnitsOnRootLevel();
    for (final IUnit unit : onRootLevel) {
        treeItems.add(new MyTreeItem(unit));
    }
    root.getChildren().clear();
    root.getChildren().addAll(treeItems);
}

每个项目都被包裹

public class MyTreeItem extends TreeItem<IUnit> {
    private final IUnit unit;
    public MyTreeItem(final IUnit unit) {
        super(unit, new LevelImage(unit.getLevel().getIcon()).getImage());
        this.unit = unit;
    }
}

每个项目都会从BufferedImage转换图像

public class LevelImage {
    private ImageView imageView;
    public LevelImage(final BufferedImage image) {
        imageView = new ImageView();
        imageView.setFitHeight(16);
        imageView.setFitWidth(16);
        imageView.setVisible(true);
        imageView.setImage(SwingFXUtils.toFXImage(image, null));
    }
    public ImageView getImage() {
        return this.imageView;
    }
}

原则上,这很好。 不幸的是,当我展开或关闭节点或刷新整个表时,这会留下图像的伪像,或者根本不再绘制图像。 有谁知道这可能是什么原因。 我从Java 10.0.1开始使用JavaFX

外观示例

@Itai:谢谢! 但这似乎只是答案的一半。 问题也是这样的:

public MyTreeItem(final IUnit unit) {
    super(unit, >> new LevelImage(unit.getLevel().getIcon()).getImage())  <<;
    this.unit = unit;
}

我无法在此处设置图像,而必须在CellFactory中进行设置。 否则,这将不起作用。 所以这里的正确代码是

public MyTreeItem(final IUnit unit) {
    super(unit);
    this.unit = unit;
}

并且在工厂中完成了魔术,这意味着第一列不能再只是字符串了,而必须是对象本身才能获得图标。

无论如何,昨天我当然想到的是,TreeTableCell是一个私有的 “ updateItem”方法,带有just和“ integer”作为参数。 昨天我的挫败感似乎很高,我错过了这个细节(参数)。 我真的以为TreeTableCell的工作原理与其他所有对象不同,无论出于何种原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM