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

时间:2018-11-27 01:58:38

标签: java javafx treeview

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

例如

JavaFX CheckBoxTreeItem graphic disappear when siblings collapse

JavaFX CheckBoxTreeItem: Graphic disappears if graph is extended

有什么想法吗?

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

我尝试使用@Jai提供的想法,但是当我单击“展开/折叠”图标时,仍然存在问题。附件是屏幕截图。在此先感谢您。

enter image description here

1 个答案:

答案 0 :(得分:0)

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