简体   繁体   English

展开/折叠时,JavaFX CheckBoxTreeItem图形消失/出现

[英]JavaFX CheckBoxTreeItem graphic disappear/appear when expanding/collapsing

I'm trying to make TreeView with CheckBoxTreeItems. 我正在尝试使用CheckBoxTreeItems创建TreeView。 When I collapse/expand a CheckBoxTreeItems the image I set up does not display correctly. 当我折叠/展开CheckBoxTreeItems时,我设置的图像无法正确显示。 I googled but I couldn't find correct answer. 我用谷歌搜索,但找不到正确答案。 On Stack Overflow, I found a similar problem, but I didn't get a valid answer. 在Stack Overflow上,我发现了类似的问题,但没有得到有效的答案。

Eg 例如

JavaFX CheckBoxTreeItem graphic disappear when siblings collapse 当兄弟姐妹崩溃时,JavaFX CheckBoxTreeItem图形消失

JavaFX CheckBoxTreeItem: Graphic disappears if graph is extended JavaFX CheckBoxTreeItem:如果扩展图形,则图形消失

Any ideas? 有任何想法吗?

public class ClientApplication extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(final Stage stage) {
        ImageView folderIcon = new ImageView();
        Image folderImage = new Image("image/folder.png");
        folderIcon.setImage(folderImage);
        folderIcon.setFitWidth(16);
        folderIcon.setFitHeight(16);
        CheckBoxTreeItem<String> rootItem = new CheckBoxTreeItem<String>("folder", folderIcon);
        rootItem.setExpanded(true);

        for (int i = 0; i < 4; i++) {
            CheckBoxTreeItem<String> checkBoxTreeItem = new CheckBoxTreeItem<String>("Sample" + (i + 1), folderIcon);
            rootItem.getChildren().add(checkBoxTreeItem);
        }

        final TreeView<String> tree = new TreeView<String>(rootItem);
        tree.setCellFactory(CheckBoxTreeCell.<String>forTreeView());
        tree.setRoot(rootItem);
        tree.setShowRoot(true);


        StackPane root = new StackPane();
        root.getChildren().add(tree);
        stage.setScene(new Scene(root, 300, 250));
        stage.show();
    }
}

enter image description here 在此处输入图片说明

I tried to use the ideas provided by @Jai,But when I click the expand/collapse icon, there is still a problem.Attachment is a screenshot.Thanks in advance. 我尝试使用@Jai提供的想法,但是当我单击展开/折叠图标时,仍然存在问题。附件是屏幕截图。在此先感谢您。

enter image description here 在此处输入图片说明

ImageView is a JavaFX control. ImageView是JavaFX控件。 This means that each instance represents a unique control you see on your screen. 这意味着每个实例代表您在屏幕上看到的唯一控件。 You should never use the same instance for multiple locations in your GUI. 您绝对不应在GUI中的多个位置使用同一实例。

On the other hand, Image represents an image (ie an array of pixel data), so it is reusable. 另一方面, Image表示图像(即像素数据的数组),因此可以重复使用。

This should work: 这应该工作:

@Override
public void start(final Stage stage) {
    final Image folderImage = new Image("image/folder.png");

    CheckBoxTreeItem<String> rootItem = new CheckBoxTreeItem<String>("folder", createImageView(folderImage));
    rootItem.setExpanded(true);

    for (int i = 0; i < 4; i++) {
        CheckBoxTreeItem<String> checkBoxTreeItem = new CheckBoxTreeItem<String>("Sample" + (i + 1), createImageView(folderImage));
        rootItem.getChildren().add(checkBoxTreeItem);
    }

    final TreeView<String> tree = new TreeView<String>(rootItem);
    tree.setCellFactory(CheckBoxTreeCell.<String>forTreeView());
    tree.setRoot(rootItem);
    tree.setShowRoot(true);


    StackPane root = new StackPane();
    root.getChildren().add(tree);
    stage.setScene(new Scene(root, 300, 250));
    stage.show();
}

private ImageView createImageView(Image folderImage) {
    ImageView folderIcon = new ImageView();
    folderIcon.setImage(folderImage);
    folderIcon.setFitWidth(16);
    folderIcon.setFitHeight(16);

    return folderIcon;
}

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

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