![](/img/trans.png)
[英]how to create a path to a picture taken from a database and saved a folder?
[英]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.