簡體   English   中英

來自文件夾路徑的Jtree保存在數據庫中

[英]Jtree from folder path saved in database

我想從保存在數據庫中的文件夾路徑(如TestFolder / ABCD / CDEF / ghml TestFolder / ABCD / THYU / UVWZ)創建jtree,我只保存路徑而不是父結構,因此當我嘗試創建樹結構時,它可以很好地用於單個路徑( TestFolder / ABCD / CDEF / ghml)如果有人有主意,我想給我一個完整的樹結構,請幫忙

public class MainClass {

public static void main(String[] a) throws ClassNotFoundException, SQLException {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.add(new JTreeEvents());
    f.setSize(500, 500);
    f.setVisible(true);
}
}

enter code here

 class JTreeEvents extends JPanel {

private String driver = new String("com.mysql.jdbc.Driver");
private String url = new String("jdbc:mysql:);
private String user = new String("root");
private String password = new String("128");
private Connection dbCon;
List<String> arrayList;
Map<String, Map<Integer, String>> map;
String[] folderArr;
PreparedStatement ps = null;
java.sql.Statement s;
ResultSet r;
DefaultMutableTreeNode top;
DefaultTreeModel dt;
DefaultMutableTreeNode trees;
DefaultTreeModel model;
DefaultMutableTreeNode child, subchild;
//tree  

JTree jtree;

JTextField jtf;

public JTreeEvents() throws ClassNotFoundException, SQLException {
    //------------------------------------------------------------------
    Class.forName(driver);
    dbCon = DriverManager.getConnection(url, user, password);
    s = dbCon.createStatement();
    r = s.executeQuery("SELECT * FROM project p where p.name='MyFolder4'");
    arrayList = new ArrayList<String>();
    map = new HashMap<String, Map<Integer, String>>();
    Hashtable<String, Object> hashtable = new Hashtable<String, Object>();
    DefaultMutableTreeNode root;
    MutableTreeNode parent;
    DefaultMutableTreeNode parentnode;
    TreePath path = null;
    while (r.next()) {
        arrayList.add(r.getString("path"));
    }

    for (String str : arrayList) {
        if (str != null) {
            folderArr = str.split("/");
            String projName = str.split("/")[0];
            root = new DefaultMutableTreeNode(projName);
            model = new DefaultTreeModel(root);
            jtree = new JTree(model);

            for (int i = 0; i < folderArr.length; i++) {

                if (i == 0) {
                    parent = new DefaultMutableTreeNode(folderArr[0]);
                } else {
                    path = jtree.getNextMatch(folderArr[i - 1].toString(), 0, Position.Bias.Forward);
                    if (path != null) {
                        System.out.println(path);
                    }
                    parent = (DefaultMutableTreeNode) (MutableTreeNode)                                                            path.getLastPathComponent();                                       

                }  
enter code here
                model = (DefaultTreeModel) jtree.getModel();
                model.insertNodeInto((DefaultMutableTreeNode) new                           DefaultMutableTreeNode(folderArr[i]), parent, parent.getChildCount());

                model.reload();
                jtree.expandPath(path);
            }
        }

    }

    int v = ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;
    int h = ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED;
    JScrollPane jsp = new JScrollPane(jtree, v, h);

    add(jsp, BorderLayout.CENTER);

    jtf = new JTextField("", 20);
    add(jtf, BorderLayout.SOUTH);

    jtree.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent me) {
            doMouseClicked(me);
        }
    });
}
enter code here
void doMouseClicked(MouseEvent me) {
    TreePath tp = jtree.getPathForLocation(me.getX(), me.getY());
    if (tp != null) {
        jtf.setText(tp.toString());
    } else {
        jtf.setText("");
    }
}
      private TreePath find(DefaultMutableTreeNode root, String s) {
@SuppressWarnings("unchecked")
Enumeration<DefaultMutableTreeNode> e = root.depthFirstEnumeration();
while (e.hasMoreElements()) {
    DefaultMutableTreeNode node = e.nextElement();
    if (node.toString().equalsIgnoreCase(s)) {
        return new TreePath(node.getPath());
          }
 }
 return null;
    }
 }

有幾件事在您的代碼中不起作用。 首先,可以像下面這樣大大簡化構建樹的代碼:

public JTreeEvents() throws ClassNotFoundException, SQLException {
  // ... fill the array list from the database ..

  for (String path: arrayList) {
    DefaultMutableTreeNode currentParent = root;
    String[] pathComponents = path.split("/");
    for (String comp: pathComponents) {
      DefaultMutableTreeNode child = findChild(currentParent, comp);
      if (child == null) {
        child = new DefaultMutableTreeNode(comp);
        currentParent.add(child);
      }
      currentParent = child;
    }
  }

  model = new DefaultTreeModel(root);
  jtree = new JTree(model);

  // ... build the rest of the GUI components
}

private DefaultMutableTreeNode findChild(DefaultMutableTreeNode parent, String s) {
  for (int i=0; i<parent.getChildCount(); i++) {
    DefaultMutableTreeNode child = (DefaultMutableTreeNode) parent.getChildAt(i);
    if (s.equals(child.getUserObject())) return child;
  }
  return null;
}

第二件事是,JPanel默認不帶布局,因此您需要在添加任何組件之前顯式添加一個:

this.setLayout(new BorderLayout());

因此,在除去所有未使用的變量聲明之后,JTreeEvent的完整代碼將變為:

public class JTreeEvents extends JPanel {
  private String driver = new String("com.mysql.jdbc.Driver");
  private String url = new String("jdbc:mysql:");
  private String user = new String("root");
  private String password = new String("128");
  private Connection dbCon;
  List<String> arrayList;
  PreparedStatement ps = null;
  java.sql.Statement s;
  ResultSet r;
  DefaultMutableTreeNode root = new DefaultMutableTreeNode("/");
  DefaultTreeModel model;
  JTree jtree;
  JTextField jtf;

  public JTreeEvents() throws ClassNotFoundException, SQLException {
    Class.forName(driver);
    dbCon = DriverManager.getConnection(url, user, password);
    s = dbCon.createStatement();
    r = s.executeQuery("SELECT * FROM project p where p.name='MyFolder4'");
    arrayList = new ArrayList<String>();
    while (r.next()) {
      arrayList.add(r.getString("path"));
    }

    for (String path: arrayList) {
      DefaultMutableTreeNode currentParent = root;
      String[] pathComponents = path.split("/");
      for (String comp: pathComponents) {
        DefaultMutableTreeNode child = findChild(currentParent, comp);
        if (child == null) {
          child = new DefaultMutableTreeNode(comp);
          currentParent.add(child);
        }
        currentParent = child;
      }
    }

    setLayout(new BorderLayout());

    model = new DefaultTreeModel(root);
    jtree = new JTree(model);

    int v = ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;
    int h = ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED;
    JScrollPane jsp = new JScrollPane(jtree, v, h);
    add(jsp, BorderLayout.CENTER);

    jtf = new JTextField("", 20);
    add(jtf, BorderLayout.SOUTH);

    jtree.addMouseListener(new MouseAdapter() {
      public void mouseClicked(MouseEvent me) {
        doMouseClicked(me);
      }
    });
  }

  void doMouseClicked(MouseEvent me) {
    TreePath tp = jtree.getPathForLocation(me.getX(), me.getY());
    if (tp != null) {
      jtf.setText(tp.toString());
    } else {
      jtf.setText("");
    }
  }

  private DefaultMutableTreeNode findChild(DefaultMutableTreeNode parent, String s) {
    for (int i=0; i<parent.getChildCount(); i++) {
      DefaultMutableTreeNode child = (DefaultMutableTreeNode) parent.getChildAt(i);
      if (s.equals(child.getUserObject())) return child;
    }
    return null;
  }
}

通過在代碼中手動向數組列表添加路徑,我在沒有數據庫內容的情況下對其進行了測試,並且效果很好:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM