2012-07-26 50 views
1

应用是有两个简单的面板在一帧如何显示JTree上的动态更新?/如何刷新或重新加载JTree?

  1. 第一板,从数据库中检索所有学生S,使用多个HashMap中得到父母和子女的安排,并显示在树上。

  2. 第二个面板,当你点击学生在文本框中显示的那个学生的所有细节(selectionlistener)。

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

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

任何人都可以帮助我在这里。通过网上的很多解决方案,所有都是部分,我不能适用于我的代码。

在此先感谢。


主要frame.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

考虑简化您的代码,使其可以为我们运行,但删除了所有数据库引用并删除了与该问题无关的所有代码,以便隔离问题,并且如果问题仍然存在,允许我们运行你的代码不需要你的数据库,在不经过大量无关代码的情况下检查你的代码,并希望能够让我们找到一个修复程序。 – 2012-07-26 14:19:12

+0

嗨Hovercraft充满鳗鱼,感谢您的经历。其实代码是可运行的。数据库文件也在那里,您只需将其粘贴到netbeans derby中即可。将java文件粘贴并运行到一个新的项目文件夹中。让我知道如果我仍然应该删除它。 – 2012-07-26 14:20:46

+1

@SurajB当然,删除没有必要的东西。如果没有创建数据库,添加公共集合等,代码无法运行......这使得其他人难以抓住您的代码并执行它。有太多的代码要阅读。 Als,你应该考虑以下几点:1)不要默默地捕获异常(这是一个新手的错误)2)正确缩进你的代码3)遵循java编码约定:类名以大写字母开头,包仅应包含小写字母,变量以小写字母开头等...使用骆驼大小写而不是下划线 – 2012-07-26 14:27:21

回答

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模式和通知更新值视图的模型更清晰,但需要额外的努力来设置。

对于什么是值得的,你应该考虑删除那些不需要或不适当使用的关键字。只要有可能,您应尽量避免使用该关键字(除非与final一起使用来描述恒定值)。

还有一件事,试着用合适的LayoutManager来代替绝对定位。使用适当的布局管理器可以使您的代码更容易维护,并且可以跨不同平台/外观更加便携。

+0

非常感谢您的输入Guillaume Polet。我会尽可能地尝试并删除静态,并放下布局管理器。至于刷新,你能指导我如何通过我的代码刷新整个树?我知道它的代价高昂,但那就是现在这个小时的需要。 – 2012-07-27 04:34:36

+0

嗨trashgod,谢谢你看我的问题。实际上,我访问了您提供的示例,但无法找到重新使用的位置。如果你能给我一个关于如何在JTree上实现它的指针,我会非常感激。 – 2012-07-27 04:37:49

+0

@SurajB:为我粗心的链接道歉;这个相关的[示例](http://stackoverflow.com/a/11639595/230513)使用'reload()'。 – trashgod 2012-07-27 05:37:48