1

テーブル名student_detailsを持つtree1という名前のデータベーステーブルがあります。このテーブルには、student_name、student_details、student_phoneの3つの列があります

これで、データベースから学生の詳細を取得できますが、静的な方法でのみ取得できます。

質問は、新しい学生の詳細行 {student_name,student_details,student_phone} を挿入するときに、それを Jtree に表示したいということです。ハッシュマップは解決策ですが、動的ノードを作成するために Jtree でハッシュマップを使用する方法を理解できません。

以下は、静的な Jtree を作成できるコードです。これを動的にしたいと考えています。コードサンプルでこれを行う方法を教えてもらえますか?

package tree_try;


import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.beans.Statement;
import java.sql.*;
import java.util.ArrayList;
import java.util.Iterator;
import javax.swing.*;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.*;


public class SimpleTree extends JFrame
{
   public Connection connect = null;


   public Statement statement = null;
   public Statement statement2 = null;
    public Statement statement3 = null;
      public Statement statement4 = null;
   public Statement statement5 = null;
    public Statement statement6 = null;

   public ResultSet resultSet = null;
   public ResultSet resultSet2 = null;
    public ResultSet resultSet3 = null;
     public ResultSet resultSet4 = null;
   public ResultSet resultSet5 = null;
    public ResultSet resultSet6 = null;



   public ArrayList arrayList = new ArrayList();
   public ArrayList arrayList2 = new ArrayList();
   public ArrayList arrayList3 = new ArrayList();
   public ArrayList arrayList4 = new ArrayList();

   static String store[] = new String[10];
   static String store2[] = new String[10];
   static String store3[] = new String[10];

   //for the panel

   static String store4[] = new String[10];
   static String store5[] = new String[10];
   static String store6[] = new String[10];
    static String store7[] = new String[10];

   //for panel over


   int i=0;
   int i1=0;
   int i2=0;
   int i3=0;



    JPanel jp1 = new JPanel();
    JPanel jp2 = new JPanel();
    JFrame jf1 = new JFrame();

    JButton jb1 = new JButton("Save");
       JButton jb2 = new JButton("Cancel");

    JTextField jt1= new JTextField();
    JTextField jt2 = new JTextField();
    JTextField jt3= new JTextField();
    JTextField jt4 = new JTextField();



    JLabel jl0 = new JLabel();

    JLabel jl1 = new JLabel("Name : ");
    JLabel jl2 = new JLabel("Adress : ");
    JLabel jl3 = new JLabel("Phone Number : ");
    JLabel jl4 = new JLabel("Other Deatils : ");
    JLabel jl5 = new JLabel("");


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

  public SimpleTree() 
  {

    super("Schools database");
    WindowUtilities.setNativeLookAndFeel();
    addWindowListener(new ExitListener());





     //db part
      try 
                {
            Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance();
            connect = DriverManager.getConnection("jdbc:derby://localhost:1527/treedata1","suraj","suraj");
            PreparedStatement statement = connect.prepareStatement("SELECT * from school_details");
                        PreparedStatement statement2 = connect.prepareStatement("select student_name from student_details where s_id =1");   
                         PreparedStatement statement3 = connect.prepareStatement("select student_name from student_details where s_id =2");   

                         //for the panel display


                         //PreparedStatement statement5 = connect.prepareStatement("select student_name from student_details where s_id =1");   
                         //PreparedStatement statement6 = connect.prepareStatement("select student_name from student_details where s_id =2");



            resultSet = statement.executeQuery();
            while (resultSet.next()) 
                        {
                String sname = resultSet.getString("school_name");
                String sid = resultSet.getString("s_id");
                arrayList.add(sname);
                                System.out.println("this is stsement one"+sname);
                                //arrayList.add(number);

            }

                        resultSet2 = statement2.executeQuery(); 
                        while (resultSet2.next())
                        {
                                String user2 = resultSet2.getString("student_name");
                //int  number2 = resultSet2.getInt("s_id");
                                arrayList2.add(user2);
                                System.out.println("this is stsement two"+user2);
                        }
                      //  System.out.println(arrayList); 
                         resultSet3 = statement3.executeQuery(); 
                        while (resultSet3.next())
                        {
                                String user3 = resultSet3.getString("student_name");
                //int  number2 = resultSet2.getInt("s_id");
                                arrayList3.add(user3);
                                System.out.println("this is stsement three"+user3);
                        }
                        System.out.println("this is after statement 3 before 4");



        } 
                catch (Exception e2) 
                {
            e2.printStackTrace();
        } 





      //
    Iterator it = arrayList.iterator();
    while (it.hasNext()) 
    {
         store[i]= (String) it.next();
         i++; 
                 //System.out.println(it.next());
    }


    Iterator it2 = arrayList2.iterator();
    while (it2.hasNext()) 
    {
         store2[i1]= (String) it2.next();
         i1++;        
        //System.out.println(it.next());
    }

     Iterator it3 = arrayList3.iterator();
    while (it3.hasNext()) 
    {
         store3[i2]= (String) it3.next();
         i2++;        
       // System.out.println(it.next());
    }








    // ------------------------- Visible Settings start here --------------------//

     Object[] hierarchy ={"Click for schools",new Object[] {store[0],new Object[] { "Student Details",store2[0],store2[1] } },new Object[] { store[1],new Object[] { "Student Details",store3[0],store3[1]}}};
    DefaultMutableTreeNode root = processHierarchy(hierarchy);
    final JTree tree = new JTree(root);

   // setSize(275, 300);
    jp1.setSize(50,50);
    jp1.setBackground(Color.WHITE);
    jf1.setExtendedState(Frame.MAXIMIZED_BOTH);
    jf1.setLayout(new GridLayout(1,2));
    jf1.setVisible(true);
    jf1.add(new JScrollPane(tree), BorderLayout.WEST);
    jf1.add(jp1);
    jp1.setLayout(null);

  jl0.setBounds(10,1,500,100);  
  jp1.add(jl0);


 jl1.setBounds(55,90,150,100);   
 jt1.setBounds(225,130, 155, 25);

 jp1.add(jl1);
 jp1.add(jt1);

 jl2.setBounds(55,160, 150, 100);
 jt2.setBounds(225,200, 155, 25);

 jp1.add(jl2);
 jp1.add(jt2);

 jl3.setBounds(55,230,150,100);
 jt3.setBounds(225,270, 155, 25);

  jp1.add(jl3);
  jp1.add(jt3);

 jl4.setBounds(55,295, 150, 100);
 jt4.setBounds(225,330, 155, 25);

  jp1.add(jl4); 
  jp1.add(jt4);

  jb1.setEnabled(false);
  jb2.setEnabled(false);

 jb1.setBounds(150,430, 100, 50);
 jb2.setBounds(350,430, 100, 50);

  jp1.add(jb1);
  jp1.add(jb2);

  //-----------------Visible setting stop here--------------------------//

   //------------------- Element actions here------------------------//


    jt1.addFocusListener(new FocusListener() {

            @Override
            public void focusGained(FocusEvent e) 
            {
             jb1.setEnabled(true);
             jb2.setEnabled(true);    
            }

            @Override
            public void focusLost(FocusEvent e) 
            {
                jb1.setEnabled(false);
                jb2.setEnabled(false); 
            }
        });

    //now for the tree

    tree.addTreeSelectionListener(new TreeSelectionListener() {

            @Override
            public void valueChanged(TreeSelectionEvent e) {
                jf1.dispose();
                //jl0.setText("Displaying information About :  "+tree.getLastSelectedPathComponent().toString());
                store7[0]= tree.getLastSelectedPathComponent().toString(); 
                System.out.println("in store 7 of 0"+store7[0]);
                dbaction db = new dbaction(store7[0]);
            }
        }); 

   }
//------------------------------------end of action listening-------------------------

  private DefaultMutableTreeNode processHierarchy(Object[] hierarchy) 
  {
    DefaultMutableTreeNode node = new DefaultMutableTreeNode(hierarchy[0]);DefaultMutableTreeNode child;
    for(int i=1; i<hierarchy.length; i++) 
    {
      Object nodeSpecifier = hierarchy[i];
      if (nodeSpecifier instanceof Object[])  // Ie node with children
        child = processHierarchy((Object[])nodeSpecifier);
      else
        child = new DefaultMutableTreeNode(nodeSpecifier); // Ie Leaf
      node.add(child);
    }
    return(node);
  }

    private void close() 
    {
        try {
            if (resultSet != null) 
                        {
                resultSet.close();
            }
            if (statement != null) 
                        {
                //statement.
            }
            if (connect != null) 
                        {
                connect.close();
            }
        } 
        catch (Exception e3) 
                {
        e3.printStackTrace();
        }
    }
}

もちろん、dbaction.java は、データベースに接続して詳細を取得する場所です。

4

2 に答える 2

2

JTreeMaxがリンクしているチュートリアルには、更新方法に関する必要なスニペットを含む「動的更新」をカバーするセクションがありJTreeますTreeModelJTree基本的な考え方は、 ()の背後にあるモデルを更新し、TreeModelから正しいイベントを発生させることTreeModelです。はそれらのJTreeイベントをリッスンし、それに応じて自身を更新します。

その隣に、他のアドバイスがあります。

  • Swingコンポーネントには、イベントディスパッチスレッド(EDT)でのみアクセスする必要がありますが、現在の例ではそうではありません。詳細については、Swingチュートリアルの同時実行性を参照してください。
  • メインメソッドをEDTで実行するように調整した瞬間、EDTをブロックし、UIが応答しなくなるため(Maxがすでに示したように)、長時間実行されるタック(データベースアクセス)を回避する必要があります。
  • nullを使用してすべてのコンポーネントをレイアウトおよび手動で配置することは避けてくださいsetBounds。そうしないと、UIのサイズを変更するなどの単純なことで、レイアウトが混乱します。LayoutManager代わりに使用してください。LayoutManagersの使用法については、OracleサイトのLayoutManagerチュートリアル」でも説明されています。
于 2012-07-17T06:08:14.720 に答える
2

ツリーのデータ モデルを作成することをお勧めします。ツリーの使用方法チュートリアルには良い例があります。詳細については、 TreeModelの理解も参照してください。

ちなみに、Event Dispatch Threadでデータベースにアクセスするなど、長時間実行されるタスクは実行しないでください。そのようなタスクについては、 SwingWorkerを調べてください。

于 2012-07-17T05:02:34.683 に答える