【问题标题】:Equal/Assign two JTrees in Java在Java中相等/分配两个JTree
【发布时间】:2016-06-20 12:41:20
【问题描述】:

Step1-首先我创建一个First Jtree。

Step2-然后使用这个Jtree我创建了一组JTrees并使用一些计算的权重值添加到HashMap。

Step3-然后我从这个HashMap中选择一个JTree。

Step4-现在我想从 step2 重复到 step3。

在重复之前,我只想为未来的过程选择选定的树。 但它需要最终的 HashMap 将树添加到收割过程。我更新了相同的树并添加到 HashMap。

        public class JavaTree extends JFrame {

            public static HashMap<String, DefaultMutableTreeNode> nodeReg = new HashMap<String, DefaultMutableTreeNode>();

            public static void main(String[] args) {

            }

            public JTree method1() {

                HashMap<JTree, Double> value = new HashMap<JTree, Double>();

                //create tree root
                DefaultMutableTreeNode Treeroot = new DefaultMutableTreeNode(new NodeInfor3(rootNode,x1));

                //create tree
                JTree firstTree = new JTree(Treeroot);
                add(firstTree);

                // create the child nodes
                DefaultMutableTreeNode node1 = new DefaultMutableTreeNode(new NodeInfor3(nodeName1, x2));
                DefaultMutableTreeNode node2 = new DefaultMutableTreeNode(new NodeInfor3(nodeName2), x3));
                nodeReg.put(rootNode, Treeroot);
                nodeReg.put(nodeName1), node1);
                nodeReg.put(nodeName2, node2);

                Treeroot.add(node1);
                Treeroot.add(node2);

                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                this.setTitle("First JTree");
                this.pack();
                this.setVisible(true);



                for (Map.Entry m1 : newNodeSet.entrySet()) {-----forloop X

                    for (Map.Entry m3 : TargetNodes.entrySet()) { -----forloop Y

                        DefaultMutableTreeNode targetNode = nodeReg.get(nodeName3);

                        targetNode.add(newAddingNode);

                        tree2 = new JTree(Treeroot);
                        add(tree2);


                        //ADD TO CALCULATION 

                        WeghtOfSubTrees.put(tree2, calculated value));

                    }

                    //find maximum value with tree-using WeightOfSubTrees HashMap
                     I take selected Jtree name as a SELECTEDTREE
    -------------------------------------------------------------------------               
                    //THEN I WANT TO REPEAT. BUT WANT TO TAKE SELECTED TREE TO ABOVE PROCEDURE. IT TOOK FINAL VALUE OF HASHmAP. 

                    tree2.removeAll(); -------------------------------???????
                    tree2 =SELECTEDTREE;-----------------------???????
      -------------------------------------------------------------------------             
                    WeghtOfSubTrees.clear();

                }

                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                this.setTitle("New tree");
                this.pack();
                this.setVisible(true);

            }
        }

我在上面的代码中包含了编辑点。可能是复杂的代码。我想我想将新选择的 Jtree 分配给第一个 Jtree。我使用了以下代码部分。

                    tree2.removeAll(); 
                    tree2 =SELECTEDTREE;

但是,它不起作用。如何在 gotofor loop X 之前为第一个创建的树分配新树?

【问题讨论】:

  • 我真的对你的代码感到困惑。你能发布一个工作代码吗?
  • 感谢您的回复。但是我的代码很大。因此,我将其添加为摘要。我为此感到抱歉。正如我最后提到的,有没有办法让一个 Jtree 与另一个 Jtree 相等?
  • 好的,您可以存储模型并将模型传递给选定的树,而不是存储树本身。
  • 您所说的“模型”是什么意思?我无法接受你的想法。
  • 每棵树都有一个模型。基于模型,树显示在 UI 上,模型保存数据。因此,不要将树放入地图中,而是将模型放入地图中。而不是这个tree2.removeAll(); tree2 =SELECTEDTREE;,你可能不得不这样做tree2.setModel(SELECTEDTREE.getModel());

标签: java jtree


【解决方案1】:

根据您共享的代码,您将节点添加到现有根并基于同一根创建树。我已经创建了克隆或树的方法。

    private JTree createTree(DefaultMutableTreeNode rootNode ) {
        NodeInfor3 info =(NodeInfor3)rootNode.getUserObject();
        //NodeInfor3 node  = new NodeInfor3(info.name, info.getSpecVal());
        DefaultMutableTreeNode newRoot = new DefaultMutableTreeNode(info);
        JTree tree = new JTree(newRoot);
        copyChildren(rootNode, newRoot);
        return tree;
    }

    private void copyChildren(DefaultMutableTreeNode source , DefaultMutableTreeNode target) {

        for (int i = 0; i < source.getChildCount(); i++) {
            DefaultMutableTreeNode node = (DefaultMutableTreeNode)source.getChildAt(i);
            NodeInfor3 info =(NodeInfor3)node.getUserObject();
            DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(info);
            target.add(newNode);
            if(node.isLeaf() == false){
                copyChildren(node, newNode);
            }
        }
    }

    private void refreshNodeReg(DefaultMutableTreeNode root) {
        NodeInfor3 node = (NodeInfor3)root.getUserObject();
        nodeReg.put(node.getName(), root);
        for (int i = 0; i < root.getChildCount(); i++) {
            refreshNodeReg((DefaultMutableTreeNode)root.getChildAt(i));
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 2023-03-07
    相关资源
    最近更新 更多