Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何动态构建jtree_Java_Swing_Dynamic_Jtree - Fatal编程技术网

Java 如何动态构建jtree

Java 如何动态构建jtree,java,swing,dynamic,jtree,Java,Swing,Dynamic,Jtree,问题的SSCCE如下所示。我正在动态填充JTree,但什么也没有发生 import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Vector; import javax.swing.JButton; impo

问题的SSCCE如下所示。我正在动态填充
JTree
,但什么也没有发生

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;

public class DynamicTreeDemo extends JFrame
                        implements ActionListener {
private int newNodeSuffix = 1;
private static String ADD_COMMAND = "add";
private static String REMOVE_COMMAND = "remove";
private static String CLEAR_COMMAND = "clear";

private JTree jtrMainMenu;
DefaultMutableTreeNode   rootNode = null;
DefaultTreeModel treeModel;
public DynamicTreeDemo() {
    super(new BorderLayout());

    //Create the components.
    jtrMainMenu = new JTree();
    populateTree();

    JButton addButton = new JButton("Add");
    addButton.setActionCommand(ADD_COMMAND);
    addButton.addActionListener(this);

    JButton removeButton = new JButton("Remove");
    removeButton.setActionCommand(REMOVE_COMMAND);
    removeButton.addActionListener(this);

    JButton clearButton = new JButton("Clear");
    clearButton.setActionCommand(CLEAR_COMMAND);
    clearButton.addActionListener(this);

    //Lay everything out.
    jtrMainMenu.setPreferredSize(new Dimension(300, 150));
    add(jtrMainMenu, BorderLayout.CENTER);

    JPanel panel = new JPanel(new GridLayout(0,3));
    panel.add(addButton);
    panel.add(removeButton); 
    panel.add(clearButton);
add(panel, BorderLayout.SOUTH);
}


    public void populateTree() {
  Vector<Vector<String>> data =GetDataFromDB();           
 java.util.List<String> list =GetListFromDB();
        int i=0;;
 int size=list.size();
 treeModel=(DefaultTreeModel)jtrMainMenu.getModel();  

 ((DefaultMutableTreeNode)  (treeModel.getRoot())).removeAllChildren();
 treeModel.reload();
 rootNode = new DefaultMutableTreeNode("JewelleryERPApplication");
 treeModel=new DefaultTreeModel(rootNode);


 DefaultMutableTreeNode p1=null, p2=null,p3=null,p4=null,p5=null;


     while(i<size){

        if(list.get(i).length()==2){
          p1 = addObject(null, data.get(i).elementAt(1),true);  

        }else 
        if(list.get(i).length()==4){
           p2 = addObject(p1, data.get(i).elementAt(1),true);   

     }else if
       (list.get(i).length()==6){
             p3 = addObject(p2, data.get(i).elementAt(1),true);   

     }
     else if
       (list.get(i).length()==8){
             p4 = addObject(p3, data.get(i).elementAt(1),true);    

     }  
     else if
       (list.get(i).length()==10){
             p5 = addObject(p4, data.get(i).elementAt(1),true);    

     }      
         i++;
     }

    jtrMainMenu.setModel(treeModel);
   ((DefaultMutableTreeNode)  (treeModel.getRoot())).getChildCount();
    jtrMainMenu.revalidate();
    jtrMainMenu.repaint();
}


public DefaultMutableTreeNode addObject(DefaultMutableTreeNode parent,
                                        Object child, 
                                        boolean shouldBeVisible) {


          DefaultMutableTreeNode childNode = 
            new DefaultMutableTreeNode(child);



    if (parent == null) {
        parent = rootNode;
    }

//It is key to invoke this on the TreeModel, and NOT DefaultMutableTreeNode
    treeModel.insertNodeInto(childNode, parent, 
                             parent.getChildCount());

     jtrMainMenu.setModel(treeModel);

    //Make sure the user can see the lovely new node.
    if (shouldBeVisible) {
        jtrMainMenu.scrollPathToVisible(new TreePath(childNode.getPath()));
    }

    return childNode;
} 

/**
 * Create the GUI and show it.  For thread safety,
 * this method should be invoked from the
 * event-dispatching thread.
 */
private static void createAndShowGUI() {
    //Create and set up the window.
    JFrame frame = new JFrame("DynamicTreeDemo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //Create and set up the content pane.
    DynamicTreeDemo newContentPane = new DynamicTreeDemo();
    newContentPane.setOpaque(true); //content panes must be opaque
    frame.setContentPane(newContentPane);

    //Display the window.
    frame.pack();
    frame.setVisible(true);
}

public static void main(String[] args) {
    //Schedule a job for the event-dispatching thread:
    //creating and showing this application's GUI.
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }
    });
}
}
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.GridLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.util.Vector;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JTree;
导入javax.swing.tree.DefaultMutableTreeNode;
导入javax.swing.tree.DefaultTreeModel;
导入javax.swing.tree.TreePath;
公共类DynamicReedemo扩展了JFrame
实现ActionListener{
private int newNodeSuffix=1;
私有静态字符串ADD_COMMAND=“ADD”;
私有静态字符串REMOVE_COMMAND=“REMOVE”;
私有静态字符串清除\u命令=“清除”;
私有JTree jtmainmenu;
DefaultMutableTreeNode rootNode=null;
默认树模型树模型;
公共DynamicReedemo(){
超级(新边框布局());
//创建组件。
jtmainmenu=新的JTree();
populateTree();
JButton addButton=新JButton(“添加”);
addButton.setActionCommand(ADD_命令);
addButton.addActionListener(此);
JButton removeButton=新JButton(“删除”);
removeButton.setActionCommand(REMOVE_命令);
removeButton.addActionListener(此);
JButton clearButton=新JButton(“清除”);
clearButton.setActionCommand(CLEAR_命令);
clearButton.addActionListener(这个);
//把一切都安排好。
jtrMainMenu.setPreferredSize(新尺寸(300150));
添加(jtmainmenu,BorderLayout.CENTER);
JPanel面板=新JPanel(新网格布局(0,3));
panel.add(添加按钮);
面板。添加(移除按钮);
面板。添加(clearButton);
添加(面板,边界布局。南部);
}
公共void populateTree(){
向量数据=GetDataFromDB();
java.util.List List=GetListFromDB();
int i=0;;
int size=list.size();
treeModel=(DefaultTreeModel)jtmainmenu.getModel();
((DefaultMutableTreeNode)(treeModel.getRoot()).removeAllChildren();
treeModel.reload();
rootNode=新的DefaultMutableTreeNode(“珠宝商应用”);
treeModel=新的DefaultTreeModel(rootNode);
DefaultMutableTreeNode p1=null,p2=null,p3=null,p4=null,p5=null;

虽然(i您的代码有很多问题,但是…您遇到的主要问题(我认为)是,当您重新加载模型时,根节点默认会折叠

如果根节点被隐藏和/或其句柄被隐藏,它将显示为未加载任何内容

取消隐藏这些元素以进行测试

您还可以在模型重新加载后展开根节点

!!警告!!不要在根目录上运行此命令!!它将扫描所有子目录,这可能需要比您实际愿意等待的时间更长的时间:p

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;

public class FileTree {

    public static void main(String[] args) {
        new FileTree();
    }

    public FileTree() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private DefaultTreeModel model;
        private JTree tree;

        public TestPane() {
            setLayout(new BorderLayout());

            tree = new JTree();
            File rootFile = new File(".");
            DefaultMutableTreeNode root = new DefaultMutableTreeNode(rootFile);
            model = new DefaultTreeModel(root);

            tree.setModel(model);
            tree.setRootVisible(true);
            tree.setShowsRootHandles(true);

            add(new JScrollPane(tree));

            JButton load = new JButton("Load");
            add(load, BorderLayout.SOUTH);

            load.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {

                    DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
                    root.removeAllChildren();
                    model.reload();
                    File rootFile = (File) root.getUserObject();

                    addFiles(rootFile, model, root);

                    tree.expandPath(new TreePath(root));

                }
            });

        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        protected void addFiles(File rootFile, DefaultTreeModel model, DefaultMutableTreeNode root) {

            for (File file : rootFile.listFiles()) {
                DefaultMutableTreeNode child = new DefaultMutableTreeNode(file);
                model.insertNodeInto(child, root, root.getChildCount());
                if (file.isDirectory()) {
                    addFiles(file, model, child);
                }
            }

        }
    }
}
代码审查

你应该避免直接从
JFrame
进行扩展。从你的例子来看,你没有,但是被黑客入侵了,但无论如何这是不可取的

这个

jtrMainMenu.setPreferredSize(new Dimension(300, 150));
add(jtrMainMenu, BorderLayout.CENTER);
private static void createAndShowGUI() {
    //Create and set up the window.
    JFrame frame = new JFrame("DynamicTreeDemo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //Create and set up the content pane.
    BadTree newContentPane = new BadTree();
    newContentPane.setOpaque(true); //content panes must be opaque
    frame.setContentPane(newContentPane);

    //Display the window.
    frame.pack();
    frame.setVisible(true);
}
这是不可取的。
JTree
应添加到
JScrollPane

这个

jtrMainMenu.setPreferredSize(new Dimension(300, 150));
add(jtrMainMenu, BorderLayout.CENTER);
private static void createAndShowGUI() {
    //Create and set up the window.
    JFrame frame = new JFrame("DynamicTreeDemo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //Create and set up the content pane.
    BadTree newContentPane = new BadTree();
    newContentPane.setOpaque(true); //content panes must be opaque
    frame.setContentPane(newContentPane);

    //Display the window.
    frame.pack();
    frame.setVisible(true);
}
也不会起作用(根据您的示例),因为从
Window
扩展的任何内容都不能添加到扩展
Window


除非您的基本组件是从
JComponent
扩展而来,否则其他组件必须是不透明的(
JLabel
是一个明显的例外),因此将
newContentPane
设置为不透明可能是一个沉默点。

您的代码有很多问题,但是……主要问题(我认为)实际上,当您重新加载模型时,根节点在默认情况下是折叠的

如果根节点被隐藏和/或其句柄被隐藏,它将显示为未加载任何内容

取消隐藏这些元素以进行测试

您还可以在模型重新加载后展开根节点

!!警告!!不要在根目录上运行此命令!!它将扫描所有子目录,这可能需要比您实际愿意等待的时间更长的时间:p

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;

public class FileTree {

    public static void main(String[] args) {
        new FileTree();
    }

    public FileTree() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private DefaultTreeModel model;
        private JTree tree;

        public TestPane() {
            setLayout(new BorderLayout());

            tree = new JTree();
            File rootFile = new File(".");
            DefaultMutableTreeNode root = new DefaultMutableTreeNode(rootFile);
            model = new DefaultTreeModel(root);

            tree.setModel(model);
            tree.setRootVisible(true);
            tree.setShowsRootHandles(true);

            add(new JScrollPane(tree));

            JButton load = new JButton("Load");
            add(load, BorderLayout.SOUTH);

            load.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {

                    DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
                    root.removeAllChildren();
                    model.reload();
                    File rootFile = (File) root.getUserObject();

                    addFiles(rootFile, model, root);

                    tree.expandPath(new TreePath(root));

                }
            });

        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        protected void addFiles(File rootFile, DefaultTreeModel model, DefaultMutableTreeNode root) {

            for (File file : rootFile.listFiles()) {
                DefaultMutableTreeNode child = new DefaultMutableTreeNode(file);
                model.insertNodeInto(child, root, root.getChildCount());
                if (file.isDirectory()) {
                    addFiles(file, model, child);
                }
            }

        }
    }
}
代码审查

你应该避免直接从
JFrame
进行扩展。从你的例子来看,你没有,但是被黑客入侵了,但无论如何这是不可取的

这个

jtrMainMenu.setPreferredSize(new Dimension(300, 150));
add(jtrMainMenu, BorderLayout.CENTER);
private static void createAndShowGUI() {
    //Create and set up the window.
    JFrame frame = new JFrame("DynamicTreeDemo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //Create and set up the content pane.
    BadTree newContentPane = new BadTree();
    newContentPane.setOpaque(true); //content panes must be opaque
    frame.setContentPane(newContentPane);

    //Display the window.
    frame.pack();
    frame.setVisible(true);
}
这是不可取的。
JTree
应添加到
JScrollPane

这个

jtrMainMenu.setPreferredSize(new Dimension(300, 150));
add(jtrMainMenu, BorderLayout.CENTER);
private static void createAndShowGUI() {
    //Create and set up the window.
    JFrame frame = new JFrame("DynamicTreeDemo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //Create and set up the content pane.
    BadTree newContentPane = new BadTree();
    newContentPane.setOpaque(true); //content panes must be opaque
    frame.setContentPane(newContentPane);

    //Display the window.
    frame.pack();
    frame.setVisible(true);
}
也不会起作用(根据您的示例),因为从
Window
扩展的任何内容都不能添加到扩展
Window


除非您的基本组件是从
JComponent
扩展而来,否则其他组件必须是不透明的(
JLabel
是一个明显的例外),因此将
newContentPane
设置为不透明可能是一个静音点。

我首先要看一下
rootNode=newdefaultmutabletreenode(“珠宝商应用”)
在您的
addObject
方法中要更快地获得更好的帮助,请发布一条。即使删除此语句,也不会发生任何事情@MadProgrammerThis
jScrollPane_Tree.removeAll();
也让我担心,很可能您实际上已经在过程中删除了
JViewport
。现在,我也删除了@MadProgrammerI部分。我首先要看一下
rootNode=new DefaultMutableTreeNode(“珠宝商应用”)
在您的
addObject
方法中要更快地获得更好的帮助,请发布一条。即使删除此语句,也不会发生任何事情@MadProgrammerThis
jScrollPane_Tree.removeAll()
也让我担心,很可能你在这个过程中删除了
JViewport
现在我也删除了@madprogrammerThank这一部分对我有用,谢谢@MadProgrammer你是一位伟大的摇摆大师(:-@SyedMuhammadMubashir我不会这么说,我之前也做过同样的事情,花了四年时间