首页 > 解决方案 > JavaFX CheckBoxTreeItem 图形在展开/折叠时消失/出现

问题描述

我正在尝试使用 CheckBoxTreeItems 制作 TreeView。当我折叠/展开 CheckBoxTreeItems 时,我设置的图像无法正确显示。我用谷歌搜索,但我找不到正确的答案。在 Stack Overflow 上,我发现了一个类似的问题,但我没有得到有效的答案。

例如

JavaFX CheckBoxTreeItem 图形在兄弟姐妹崩溃时消失

JavaFX CheckBoxTreeItem:如果图形被扩展,图形就会消失

有任何想法吗?

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

在此处输入图像描述

我尝试使用@Jai提供的想法,但是当我点击展开/折叠图标时,仍然存在问题。附件是截图。提前致谢。

在此处输入图像描述

标签: javajavafxtreeview

解决方案


ImageView是一个 JavaFX 控件。这意味着每个实例都代表您在屏幕上看到的唯一控件。您永远不应在 GUI 中的多个位置使用相同的实例。

另一方面,Image表示一个图像(即像素数据数组),因此它是可重用的。

这应该有效:

@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;
}

推荐阅读