当前位置: 首页 > 知识库问答 >
问题:

修改TreeView的细胞工厂

司徒宇
2023-03-14

我想更改树视图中展开/取消展开的公开节点,而不使用CSS的-fx背景图像。箭头,因为尽管图像是9*9像素,但显示效果很差。我想用setCellFactory,但我不知道怎么用。

我有几个问题:

>

  • 在setCellFactory中,覆盖call或updateItem方法的目的是什么?在这种情况下要覆盖哪个?

    updateItem中的item==null或boolean empty=true有什么不同?布尔值empty=true的句柄是什么情况?

    我希望我的观点是这样的

    由于TreeView只能包含一种类型的Item和Group A标签不是Person,除了将Group A作为Person对象的名称之外,我想我只能使用循环显示树并根据它们所属的Group将TreeItems放在Box下。但是,我不知道如何制作可扩展的Box(使用VBox?Hbox?StackPane?)请给我一个提示

    package DummyGUI;
    import javafx.application.Application;
    
    import javafx.scene.*;
    import javafx.scene.control.*;
    import javafx.scene.layout.*;
    import javafx.stage.*;
    import javafx.event.ActionEvent;
    import javafx.scene.image.Image;
    import javafx.scene.image.ImageView;
    
    public class App extends Application
    {
    private final Image male = new Image(getClass().getResourceAsStream("male.png"), 16, 16, true, true);
    private final Node maleIcon = new ImageView(male);
    
    private final Image female = new Image(getClass().getResourceAsStream("female.png"), 16, 16, true, true);
    private final Node femaleIcon = new ImageView(female);
    
    private final Image plus = new Image(getClass().getResourceAsStream("plus-button.png"), 16, 16, true, true);
    private final Node plusIcon = new ImageView(plus);
    
    private final Image minus = new Image(getClass().getResourceAsStream("minus-button.png"), 16, 16, true, true);
    private final Node minusIcon = new ImageView(minus);
    
    private TreeView<Person> tree;
    public static void main(String[] args) 
    {
        launch();
    }
    public void start(Stage topView)
    {
        createGUI(topView);
    }
    private void createGUI(Stage topView)
    {
        topView.setTitle("Dummy App");
        initTree();
        VBox vb = new VBox(tree);
        topView.setScene(new Scene(vb));
        topView.show();
    }
    
    private void initTree()
    {
        Person person1 = new Person("Charles", 'M', '0');
        Person person2 = new Person("John", 'M', 'A');
        Person person3 = new Person("Pearl", 'M', 'A');
        TreeItem<Person> root = new TreeItem<>(person1);
        TreeItem<Person> child1 = new TreeItem<>(person2);
        TreeItem<Person> child2 = new TreeItem<>(person3);
        tree = new TreeView<>(root);
        root.setExpanded(true);
        root.getChildren().addAll(child1, child2);
    
        tree.setCellFactory(tv -> 
        {
            HBox hb = new HBox();
    
            TreeCell<Person> cell = new TreeCell<Person>() 
            {
                @Override
                public void updateItem(Person item, boolean empty) 
                {
                    super.updateItem(item, empty);
    
                    if(empty)
                    {
                        setGraphic(null);
                        setText(null);
                    }
                    else
                    {
                        Node icon = (item.getGender() == 'M' ? maleIcon : femaleIcon);
                        setGraphic(icon);
                        setText(item.toString());
                    }
                }
            };
            cell.setDisclosureNode(plusIcon);
            return cell;
        });
    }
    }
    
    
    
     package DummyGUI;
    
     public class Person 
     {
    String name;
    char gender;
    char group;
    
    public Person(String name, char gender, char group)
    {
        this.name = name;
        this.gender = gender;
        this.group = group;
    }
    
    public String getName()
    {
        return name;
    }
    
    public char getGender()
    {
        return gender;
    }
    
    public char getGroup()
    {
        return group;
    }
    
    public String toString()
    {
        return name;
    }
    
    }
    

    我试图将箭头图标更改为加号图标,但它有错误,因为我不知道如何覆盖updateItem。

    我不知道为什么约翰和查尔斯的性别图标在树展开时不显示,我也不知道如何添加减号图标。非常感谢。

  • 共有2个答案

    裴俊雅
    2023-03-14
    if (getTreeItem() != null) 
                    {
                        setDisclosureNode(getTreeItem().isExpanded() ? expanded : collapsed);
    
                        setOnMouseClicked(event -> {
                            setDisclosureNode(getTreeItem().isExpanded() ? expanded : collapsed);
                        });
    
                    }
    

    没关系,我想点击SetonMouse会很好,谢谢!

    令狐泓
    2023-03-14

    最简单的答案:

    基本问题是在所有单元中重复使用相同的节点实例——节点必须只有一个父节点。使用相同的方法,会悄悄地将其从以前的父级中删除(或引发异常)

    适应细胞

    tree.setCellFactory(tv -> {
        // per-cell icons 
        Node maleIcon = new Button("m");
        Node femaleIcon = new Button("f");
        Node expanded = new Label("-");
        Node collapsed = new Label("+");
        TreeCell<Person> cell = new TreeCell<Person>() {
            @Override
            public void updateItem(Person item, boolean empty) {
                super.updateItem(item, empty);
                // check if the cell is empty (no data) or if the data is null
                if (item == null || empty) {
                    setGraphic(null);
                    setText(null);
                } else {
                    Node icon = (item.getGender() == 'M' ? maleIcon
                            : femaleIcon);
                    setGraphic(icon);
                    // never-ever override toString for application reasons
                    // instead set the text from data properties
                    setText(item.getName());
    
                }
                if (getTreeItem() != null) {
                    // update disclosureNode depending on expanded state
                    setDisclosureNode(getTreeItem().isExpanded() ? expanded : collapsed);
                }
            }
        };
        return cell;
    });
    
     类似资料:
    • 我的项目涉及一个带有自定义表格模型的JTable。因为我希望用户能够修改表中的每个单元格,所以我选择让我的自定义TableModel(CSVModel)扩展DefaultTableModel。然而,由于某些原因,当我试图编辑表中的单元格时,CSVModel会抛出一个异常。我得到的唯一提示来自堆栈跟踪的最后一行: java线程“AWT-EventQueue-0”中出现异常。lang.ArrayInd

    • 细胞自动机(CA)是一个世界的模型,带有非常简单的物理。 “细胞”的意思是世界被分成一个大口袋,称为细胞。 “自动机”是一台执行计算的机器 - 它可能是一台真机。 ,但更多时候,“机器”是数学抽象或计算机的模拟。 本章介绍了史蒂文沃尔夫勒姆(Steven Wolfram)在 20 世纪 80 年代进行的实验,表明一些细胞自动机展示出令人惊讶的复杂行为,包括执行任意计算的能力。 我讨论了这些结果的含

    • 我正试图在我的公司里用代理建立这个maven项目https://github.com/gsummer/cyNeo4j Pom中列出的依赖项在Maven Central repo中不存在。。它们位于: 我收到这个错误 [错误]无法在cyneo4j项目上执行目标:无法解决项目nl.maastrichtuniversity.networklibrary的依赖项:cyneo4j:bundle:1.3dev

    • Urban Müller 1993年的Brainfuck据说有一个“至少”30000个细胞的磁带寄存器。然而,考虑到语言主要是在base 2中交易,我想知道他的“磁带”(历史上)是否有单元格。 它说了穆勒使用的细胞的确切数量吗?

    • 今天早上,我下载了Cytoscape,我再也无法成功打开该应用程序。 在此之前,我使用的是(我相信?)也没有遇到任何问题。我在一台装有Windows10的笔记本电脑上工作。 任何帮助或洞察力将非常感谢!

    • 我已经创建了一个cytoscape.js图。允许用户在任何节点上单击和缩放/向下钻取,以查看所有邻近的节点和边缘。我需要添加一个重置按钮,这将恢复图形到它的原始位置,即当页面第一次加载。我尝试使用了几个不同的函数,如cy.load、forcerender、cy.destroy和recreate graph。唯一剩下的就是从dom中清除整个对象并添加另一个cytoscape图形对象。我想知道是否有一