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



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

E.g

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提供的想法,但当我点击展开/折叠图标时,仍然存在问题。附件是一张屏幕截图。提前谢谢。

在此处输入图像描述

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

最新更新