如何在JTree上显示动态更新?/如何刷新或重新加载JTree?

时间:2012-07-26 14:14:54

标签: java swing jtree

应用很简单,一个框架中有两个面板

  1. 第一个面板,从数据库中检索所有学生,使用多个hashmap获取父子安排并在树上显示。

  2. 第二个面板,当您点击学生在文本框中显示该学生的所有详细信息(selectionlistener)时。

  3. 现在当我在第二个面板上更改学生的名字时,数据库会正确更新它,但树会显示旧值。

    我尝试过treepanel.reload(),我尝试过treemodellistener。

    任何人都可以帮助我。在网上经历了很多解决方案,所有这些都是部分解决方案,我无法应用于我的代码。

    提前致谢。


    主框架.java

    /**
     * @author Suraj Baliga
     * 
     * Returns a JFrame with two Panels one having the Jtree and other 
     * having the details of the selected tree component.It also has dynamic tree and 
     * dynamic textbox where updation of text in the textbox will change the value in 
     * databse on click of save button.The JDBC localhost url may change with each machine 
     * as the database location and port number may vary.
    */
    
    
    
    
    package Student_Details;
    
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.FocusEvent;
    import java.awt.event.FocusListener;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    import java.util.Set;
    import javax.swing.*;
    import javax.swing.tree.DefaultMutableTreeNode;
    import org.apache.commons.collections.MultiHashMap;
    
    public final class Main_frame extends JPanel 
    {
        String sname,sschool;
    
        ArrayList StudName_arrylst = new ArrayList();
        ArrayList SchlName_arrylst = new ArrayList();
        ArrayList StudDetailTxtFld_arrylst = new ArrayList();
    
    
        static public Connection connect,connect_update;
        public ResultSet resultSet;
        public static ResultSet resultset2;
        MultiHashMap SchlStud_hashmap = new MultiHashMap();
    
        int i,j,k,k2,z;
    
        DefaultMutableTreeNode tree_parent;
        int SchlName_arylist_length, StudNamearrylst_length;
        private tree_generation treePanel;
    
    
        static JButton save_button = new JButton("Save");
        static JButton cancel_button = new JButton("Cancel");
    
        static JTextField studName_txtbox= new JTextField();
        static JTextField studAddress_txtbox = new JTextField();
        static JTextField studOthr_txtbox = new JTextField();
    
       static public String user_name;
       static public String user_add;
       static public String user_other;
    
    
    
    
        static JLabel name_label = new JLabel("Name : ");
        static JLabel address_label = new JLabel("Adress : ");
        static JLabel other_label = new JLabel("Other Deatils : ");
    
       static String studDetailsTxtbox_disp[] = new String[10];
        static String studDetailsTxtbx_disp_db[] = new String[10];
        static String studDetailsTxtbxchange[] = new String[10];
    
        public JPanel panel;
        static JPanel panel_boxes = new JPanel();
    
    
    
    
        public Main_frame() 
        {
    
            super(new BorderLayout());
    
            //Create the components.
            treePanel = new tree_generation();
            populateTree(treePanel);
    
            //Lay everything out.
            treePanel.setPreferredSize(new Dimension(300, 150));
            add(treePanel, BorderLayout.WEST);
    
            panel = new JPanel(new GridLayout(1, 2));
            add(panel, BorderLayout.CENTER); 
         }
    
    
    
    
    
    
        public void populateTree(tree_generation treePanel) 
        {
            try 
            {
                Class.forName("org.apache.derby.jdbc.ClientDriver");
                connect = DriverManager.getConnection("jdbc:derby://localhost:1527/treedata2", "suraj", "suraj");
                PreparedStatement AllStuddetails = connect.prepareStatement("SELECT * from student_details");
                resultSet = AllStuddetails.executeQuery();
                while (resultSet.next()) 
                {
    
                    sname = resultSet.getString(1);
                    sschool = resultSet.getString(3);
                    SchlStud_hashmap.put(sschool, sname);
                }
            } 
            catch (Exception e) 
             {
    
             }
            Set keySet = SchlStud_hashmap.keySet();
            Iterator keyIterator = keySet.iterator();
    
            while (keyIterator.hasNext())
            {
                Object key = keyIterator.next();
                SchlName_arrylst.add(key);
    
                Collection values = (Collection) SchlStud_hashmap.get(key);
                Iterator valuesIterator = values.iterator();
    
                while (valuesIterator.hasNext()) 
                {
                    StudName_arrylst.add(valuesIterator.next());
    
                }
                SchlName_arylist_length = SchlName_arrylst.size();
                StudNamearrylst_length = StudName_arrylst.size();
    
                String schlname_tree[] = new String[SchlName_arylist_length];
                String studname_tree[] = new String[StudNamearrylst_length];
    
                Iterator SchlName_iterator = SchlName_arrylst.iterator();
    
                i = 0;
                while (SchlName_iterator.hasNext()) 
                {
                    schlname_tree[i] = SchlName_iterator.next().toString();
                }
    
                Iterator StudName_iterator = StudName_arrylst.iterator();
                j = 0;
                while (StudName_iterator.hasNext()) 
                {
                    studname_tree[j] = StudName_iterator.next().toString();
                     j++;
                }
    
                for (k = 0; k < schlname_tree.length; k++) 
                {
                      tree_parent = treePanel.addObject(null, schlname_tree[k]);
                      for (k2 = 0; k2 < studname_tree.length; k2++) 
                         {
                                treePanel.addObject(tree_parent, studname_tree[k2]);
                         }
                }
               StudName_arrylst.clear();
               SchlName_arrylst.clear();
             }
    
      }
    
    
    
    
    
    
    
        /**
         * Create the GUI and show it.  
         */
        private static void createAndShowGUI() 
        {
            //Create and set up the window.
            JFrame frame = new JFrame("Student Details");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            //Create and set up the content pane.
            Main_frame newContentPane = new Main_frame();
            newContentPane.setOpaque(true); //content panes must be opaque
            frame.setContentPane(newContentPane);
            panel_boxes.setLayout(null);
    
            name_label.setBounds(55,90,150,100);   
            studName_txtbox.setBounds(225,130, 155, 25);
            panel_boxes.add(name_label);
            panel_boxes.add(studName_txtbox);
    
    
            address_label.setBounds(55,160, 150, 100);
            studAddress_txtbox.setBounds(225,200, 155, 25);
            panel_boxes.add(address_label);
            panel_boxes.add(studAddress_txtbox);
    
            other_label.setBounds(55,220, 150, 100);
            studOthr_txtbox.setBounds(225,270, 155, 25);
            panel_boxes.add(other_label); 
            panel_boxes.add(studOthr_txtbox);
    
    
            save_button.setBounds(150,350, 100, 50);
            cancel_button.setBounds(350,350, 100, 50);
            panel_boxes.add(save_button);
            panel_boxes.add(cancel_button); 
    
            frame.add(panel_boxes); 
            //Display the window.
            frame.pack();
            frame.setSize(1000,700);
            frame.setVisible(true);
    
    
            save_button.setEnabled(false);
            cancel_button.setEnabled(false);
    
    
             studName_txtbox.addFocusListener(new FocusListener() 
             {
                @Override //since some additional functionality is added by the user to 
                          //the inbuilt function @override notation is used
                public void focusGained(FocusEvent e) 
                {
                 save_button.setEnabled(true);
                 cancel_button.setEnabled(true);
                }
    
                @Override
                public void focusLost(FocusEvent e) 
                {
                    System.out.println("out of focus textbox");
                }
    
    
            });
    
              studAddress_txtbox.addFocusListener(new FocusListener() {
    
                @Override
                public void focusGained(FocusEvent e) 
                {
                 save_button.setEnabled(true);
                 cancel_button.setEnabled(true);    
                }
    
                @Override
                public void focusLost(FocusEvent e) 
                {
                   save_button.setEnabled(false);
                    cancel_button.setEnabled(false); 
                }
            });
    
    
                studOthr_txtbox.addFocusListener(new FocusListener() {
    
                @Override
                public void focusGained(FocusEvent e) 
                {
                 save_button.setEnabled(true);
                 cancel_button.setEnabled(true);    
                }
    
                @Override
                public void focusLost(FocusEvent e) 
                {
                   save_button.setEnabled(false);
                    cancel_button.setEnabled(false); 
                }
            });
    
                 cancel_button.addActionListener(new ActionListener() 
            { 
                    public void actionPerformed(ActionEvent e) 
                    { 
                        if(e.getSource()== cancel_button )
                        {
                     clear_textboxes();
                     }
                    }
                  } );
                save_button.addActionListener(new ActionListener() 
            { 
                    public void actionPerformed(ActionEvent e) 
                    { 
                        if(e.getSource()== save_button )
                        {
                     selectionButtonPressed();
                     }
                    }
                  } );
        }
    
    
    
    
         public void fill_textboxes(ArrayList a1)
        {
            Iterator alldetails = a1.iterator();
            z=0;
            while (alldetails.hasNext()) 
             {
              studDetailsTxtbx_disp_db[z]= (String) alldetails.next();
              System.out.println("this is the Detail : "+studDetailsTxtbx_disp_db[z]);
               z++;   
             }  
    
         studName_txtbox.setText(studDetailsTxtbx_disp_db[0]);
         studAddress_txtbox.setText(studDetailsTxtbx_disp_db[1].toString());
         studOthr_txtbox.setText(studDetailsTxtbx_disp_db[2]);
    
     }
      public static void selectionButtonPressed()
        {
          studDetailsTxtbxchange[0]=studName_txtbox.getText(); 
          studDetailsTxtbxchange[1]=studAddress_txtbox.getText();
          studDetailsTxtbxchange[2]=studOthr_txtbox.getText();
          try 
            {
                if((studDetailsTxtbxchange[0].equals(""))||(studDetailsTxtbxchange[0] == null)||(studDetailsTxtbxchange[1].equals(""))||(studDetailsTxtbxchange[1] == null)||(studDetailsTxtbxchange[2].equals(""))||(studDetailsTxtbxchange[2] == null))
                {
                JOptionPane.showMessageDialog(null,"One of the Fields is Blank","Error",JOptionPane.ERROR_MESSAGE);
                }
                else
                {
                System.out.println("control here inside else baby..that has : : "+studDetailsTxtbxchange[0]);
                Class.forName("org.apache.derby.jdbc.ClientDriver");
                connect_update = DriverManager.getConnection("jdbc:derby://localhost:1527/treedata2", "suraj", "suraj");
                PreparedStatement execqry = connect.prepareStatement("select * from student_details where student_name='"+studDetailsTxtbxchange[0]+"'");
                resultset2=execqry.executeQuery();
                 System.out.println("control at end if else");
                if(resultset2.next())
                {
                    JOptionPane.showMessageDialog(null,"Sorry This name already exists","Error",JOptionPane.ERROR_MESSAGE);
                }
                else
                {
                   System.out.println("control here");
                   Class.forName("org.apache.derby.jdbc.ClientDriver");
                   connect_update = DriverManager.getConnection("jdbc:derby://localhost:1527/treedata2", "suraj", "suraj");
                   PreparedStatement updateQry = connect.prepareStatement("UPDATE student_details SET student_name='"+studDetailsTxtbxchange[0]+"',student_address='"+studDetailsTxtbxchange[1]+"',student_school='"+studDetailsTxtbxchange[2]+"' WHERE student_name='"+user_name+"' and student_address='"+user_add+"'and student_school='"+user_other+"'");
                   updateQry.executeUpdate();
                   JOptionPane.showMessageDialog(null,"Record Updated!","UPDATED",JOptionPane.OK_OPTION);
                      tree_generation.loadit();
                }
    
                } 
    
            }
            catch (Exception e) 
             {
               e.printStackTrace(); 
             }              
        }
    
      public static void clear_textboxes() 
         {
         studName_txtbox.setText(studDetailsTxtbx_disp_db[0]);
         studAddress_txtbox.setText(studDetailsTxtbx_disp_db[1].toString());
         studOthr_txtbox.setText(studDetailsTxtbx_disp_db[2]);
         }
    
        void dbaction(String string)
          {
    
          studDetailsTxtbox_disp[0]= string;
          System.out.println("This is the stuff :" + studDetailsTxtbox_disp[0]);
           try
           {
           Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance();
           connect = DriverManager.getConnection("jdbc:derby://localhost:1527/treedata2","suraj","suraj");
           PreparedStatement statement4 = connect.prepareStatement("SELECT * from student_details where student_name ='"+studDetailsTxtbox_disp[0]+"'");                
           resultSet = statement4.executeQuery();
           while(resultSet.next())
                       {
    
                                 user_name = resultSet.getString("student_name");
                                StudDetailTxtFld_arrylst.add(user_name);
                                System.out.println("name :"+user_name);
    
                                user_add = resultSet.getString("student_address");
                                StudDetailTxtFld_arrylst.add(user_add);
                                System.out.println("address : "+ user_add);
    
    
                                user_other = resultSet.getString("student_school");
                                StudDetailTxtFld_arrylst.add(user_other);
                                System.out.println("school : "+user_other);
                     }
    
        }
        catch (Exception e1) 
        {
            e1.printStackTrace();
        }
       fill_textboxes(StudDetailTxtFld_arrylst);
     }
    
    
    
    
        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();
                }
            });
        }
    }
    

    tree_generation.java

    /**
     * @author Suraj
     * 
     * Tree generation and actions such as adding new parent or child takes place here
     * Section Listeners for displaying relavent details of the selected student.
     */
    
    
    package Student_Details;
    
    import java.awt.GridLayout;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTree;
    import javax.swing.event.TreeModelEvent;
    import javax.swing.event.TreeModelListener;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.DefaultTreeModel;
    import javax.swing.tree.TreePath;
    import javax.swing.tree.TreeSelectionModel;
    import javax.swing.event.TreeSelectionEvent;
    import javax.swing.event.TreeSelectionListener;
    
    public class tree_generation extends JPanel
    {
    
    
        protected DefaultMutableTreeNode rootNode;
        protected DefaultTreeModel treeModel;
        protected JTree tree;
        public  String studDetailsTxtbox_disp[] = new String[10];
    
    
    
        public tree_generation() 
        {
          super(new GridLayout(1,0));
            rootNode = new DefaultMutableTreeNode("Click for Student Details");
            treeModel = new DefaultTreeModel(rootNode);
        tree = new JTree(treeModel);
            tree.setEditable(true);
            tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
            tree.addTreeSelectionListener(new TreeSelectionListener() 
                {
               @Override
                public void valueChanged(TreeSelectionEvent e) 
               {
               studDetailsTxtbox_disp[0]= tree.getLastSelectedPathComponent().toString(); 
               Main_frame db = new Main_frame();
               db.dbaction(studDetailsTxtbox_disp[0]);
               }
            }); 
            tree.setShowsRootHandles(true);
            JScrollPane scrollPane = new JScrollPane(tree);
            add(scrollPane);
        }
    
        /** Add child to the currently selected node. */
        public DefaultMutableTreeNode addObject(Object child) 
        {
            DefaultMutableTreeNode parentNode = null;
            TreePath parentPath = tree.getSelectionPath();
    
            if (parentPath == null) {
                parentNode = rootNode;
            } 
            else 
            {
                parentNode = (DefaultMutableTreeNode)
                             (parentPath.getLastPathComponent());
            }
    
            return addObject(parentNode, child, true);
        }
    
    
    
        public DefaultMutableTreeNode addObject(DefaultMutableTreeNode parent,
                                                Object child) 
        {
            return addObject(parent, child, false);
        }
    
    
    
    
        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
            treeModel.insertNodeInto(childNode, parent, 
                                     parent.getChildCount());
    
            //Make sure the user can see the new node.
            if (shouldBeVisible) 
            {
                tree.scrollPathToVisible(new TreePath(childNode.getPath()));
            }
            return childNode;
        }
          static void loadit()
          {
    
    
         tree_generation.treeModel.reload();
    //i tried this too//
              //treePanel = new tree_generation();
          // populateTree(treePanel);
        }
    
    
        class MyTreeModelListener implements TreeModelListener {
            public void treeNodesChanged(TreeModelEvent e) {
                DefaultMutableTreeNode node;
                node = (DefaultMutableTreeNode)(e.getTreePath().getLastPathComponent());
       node.setUserObject("HELLO WORLD");
                /*
                 * If the event lists children, then the changed
                 * node is the child of the node we've already
                 * gotten.  Otherwise, the changed node and the
                 * specified node are the same.
                 */
    
                    int index = e.getChildIndices()[0];
                    node = (DefaultMutableTreeNode)(node.getChildAt(index));
    
                System.out.println("The user has finished editing the node.");
                System.out.println("New value: " + node.getUserObject());
            }
            public void treeNodesInserted(TreeModelEvent e) {
            }
            public void treeNodesRemoved(TreeModelEvent e) {
            }
            @Override
            public void treeStructureChanged(TreeModelEvent e) 
            {
                System.out.println("tree sturct changed") ;
                     DefaultMutableTreeNode node;
                node = (DefaultMutableTreeNode)(e.getTreePath().getLastPathComponent());
       node.setUserObject("HELLO WORLD");
                tree.updateUI();
                e.getTreePath();
            }
        }
        }
    

    查询 - 数据库名称:treedata2

    create table student_details(student_name varchar(20),student_address varchar(30),student_school varchar(20));
    
    insert into student_details values('suraj','mangalore','dps');
    insert into student_details values('prassana','Bangalore lalbagh 23/16 2nd main road','dps');
    insert into student_details values('deepika','Mangalore kadri park , 177b','dav');
    insert into student_details values('sujith','delhi , rajinder nagar, d black','dav');
    insert into student_details values('sanjay','bombay marina drive, 12/34','dav');
    insert into student_details values('suresh','jaipur , lalbagh cjhowki','kv');
    insert into student_details values('manu','surat, pune warior house','kv');
    insert into student_details values('tarun','chennai, glof club','salwan');
    insert into student_details values('vinay','haryana, indutrial area','hindu senior');
    insert into student_details values('veeru','trivendrum, kottayam 12/77','canara')
    

1 个答案:

答案 0 :(得分:3)

好吧,我想我发现你的代码中没有用的东西,但你应该自己尝试并确认。

Class.forName("org.apache.derby.jdbc.ClientDriver");
connect_update = DriverManager.getConnection("jdbc:derby://localhost:1527/treedata2", "suraj", "suraj");
PreparedStatement updateQry = connect.prepareStatement("UPDATE student_details SET student_name='"+studDetailsTxtbxchange[0]+"',student_address='"+studDetailsTxtbxchange[1]+"',student_school='"+studDetailsTxtbxchange[2]+"' WHERE student_name='"+user_name+"' and student_address='"+user_add+"'and student_school='"+user_other+"'");
updateQry.executeUpdate();
JOptionPane.showMessageDialog(null,"Record Updated!","UPDATED",JOptionPane.OK_OPTION);
tree_generation.loadit();

在此代码中,您确实更新了数据库,但未更新树的模型。您正在调用静态方法loadit(),但该方法不包含任何代码。为了工作,您应该刷新/重新加载TreeModel。有不同的方法可以做到这一点。一种方法是直接发现TreeNode以刷新并使用新值更新它。另一种方法是重新创建整个TreeModel(但如果树很大,这可能会很昂贵)。使用对象映射模型(例如JPA / Hibernate),您可以使用适当的MVC模式以及通知更新值视图的模型更清晰,但需要额外的设置。

对于它的价值,您应该考虑删除那些static关键字,因为它们不是必需的,也不是适当使用的。只要有可能,您应该尽量避免使用该关键字(除非它与final一起用于描述常量值)。

还有一件事,尝试使用适当的LayoutManager而不是使用绝对定位。使用适当的布局管理器可以使您的代码更易于维护,并且可以在不同平台/外观上实现更轻松。