java - 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提供的想法,但是当我点击展开/折叠图标时,仍然存在问题。附件是截图。提前致谢。
解决方案
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;
}
推荐阅读
- vue.js - vue-webcam 选择的分辨率
- flutter - 限制用户仅使用网络提供的时间
- c# - 仅编辑时 DataGridView 不刷新。它在删除或添加行时刷新,但在编辑时不刷新
- php - 表单刷新时旧值不起作用
- c - 如何在 Eclipse 中为导入的项目创建调试文件?
- python - 如何在 Kivy 的 Builder 之外获取用户数据?
- amazon-web-services - AWS Glue 作业在长时间运行时发出警报
- r - 将字符串的最后一个单词删除到R中的第一个单词
- reactjs - 如何在下一个js中获取数据POST方法
- reactjs - 在 React 中滥用作为 prop 传递的函数时,Typescript 不会抱怨