2011-04-28 62 views
1

我正在使用java swing.I想在jTree中顯示windows註冊表它是如何可能的。我是新的java請給我一個解決方案。其實我想刪除特定的Windows註冊表項我做到了,但我無法顯示它在jtree意味着我顯示regkey刪除和刪除後的結構。我如何在jTree中顯示Windows註冊表?

+0

@abs - 您應該爲答案添加註釋,而不是編輯您的問題。由於您是新用戶,我已經爲您添加了評論。 – 2011-04-29 12:03:54

+0

重複帳戶? – kleopatra 2011-05-02 08:03:33

回答

0

看看「read/write to Windows Registry using Java

更新: 要顯示一個JTree註冊表中,您將需要提供一個TreeModel

我會從Oracle's Understanding the TreeModelFileSystemModel開始,並將調用的文件調用替換爲您正在使用的註冊表庫中。

win32註冊表可能很大,所以您可能需要添加一個TreeExpansionListener來發布已關閉的分支。這是一個Oracle article on tree expansion listeners

+0

我知道這篇文章,並閱讀此代碼,我可以通過閱讀和寫這個我也可以刪除註冊表,但通過這個程序,我不能顯示這是jTree.Actually我的問題是如何顯示jTree中的Windows註冊表。 .......請回復。 – 2011-04-29 12:04:08

+0

哈哈...良好的僞裝@Lieven as @abc,非常有說服力:-) – kleopatra 2011-05-02 07:59:34

+0

@kleopatra - 花了我一些時間自己弄清楚*我剛發佈評論* @abc試圖通過編輯添加到答案回答。 *(提醒自己,不要那樣做)* – 2011-05-02 08:03:45

1

我有類似的問題,並沒有找到可以隨時使用的東西。讀完一段後,我寫了一個TreeModel實現類來完成這個任務。
類可用於任何TreePath的列表轉換成樹,如:

A->B->C->D 
A->B->E->F 
A->G->H->J 

將變爲:

A+ 
|B+ 
| |C+ 
| | |D 
| |E+ 
| |F 
|G+ 
    |H+ 
    |J 

這就是:

import java.util.ArrayList; 
    import java.util.Arrays; 
    import java.util.Iterator; 
    import java.util.NoSuchElementException; 
    import javax.swing.event.TreeModelListener; 
    import javax.swing.tree.DefaultMutableTreeNode; 
    import javax.swing.tree.TreeModel; 
    import javax.swing.tree.TreePath; 

    /** 
    * 
    * @author Majkel 
    */ 
    public class TreePathsTreeModel implements TreeModel { 
     private final ArrayList<TreePath> paths; 
     private final String root; 

     public TreePathsTreeModel(String root, TreePath[] paths) { 
     this.root = root; 
     this.paths = new ArrayList<TreePath> (Arrays.asList(paths)); 
     } 


     @Override 
     public Object getRoot() { 
     return this.root; 
     } 

     @Override 
     public Object getChild(Object parent, int index) { 
     try { 
      return getChildren(parent).get(index); 
     } catch (IndexOutOfBoundsException ex) { 
      return null; 
     } 
     } 

     @Override 
     public int getChildCount(Object parent) { 
     return getChildren(parent).size(); 
     } 

     @Override 
     public boolean isLeaf(Object node) { 
     for (int i = 0; i < paths.size(); i++) { 
      TreePath treePath = paths.get(i); 
      if (treePath.getLastPathComponent().equals(node)) 
      return true; 
     } 
     return false; 
     } 

     // This method is only required for editable trees, so it is not 
     // implemented here. 
     @Override 
     public void valueForPathChanged(TreePath path, Object newValue) { 
     //throw new UnsupportedOperationException("Not supported yet."); 
     } 

     @Override 
     public int getIndexOfChild(Object parent, Object child) { 
     return getChildren(parent).indexOf(child); 
     } 

     // This TreeModel never fires any events (since it is not editable) 
     // so event listener registration methods are left unimplemented 
     @Override 
     public void addTreeModelListener(TreeModelListener l) { 
     //throw new UnsupportedOperationException("Not supported yet."); 
     } 

     @Override 
     public void removeTreeModelListener(TreeModelListener l) { 
     //throw new UnsupportedOperationException("Not supported yet."); 
     } 
       //search all paths in list for given object 
       //return every item one level further than it 
     private ArrayList<String> getChildren(Object parent) { 
     ArrayList<String> children = new ArrayList<String>(); 
     for (int i = 0; i < this.paths.size(); i++) { 
      ArrayList<Object> pathObjects = new ArrayList<Object>(Arrays.asList(this.paths.get(i).getPath())); 
      for (Iterator<Object> it = pathObjects.iterator(); it.hasNext();) { 
      Object parentCandidate = it.next(); 
      if (parentCandidate.equals(parent)) { 
       Iterator<Object> checker = it; 
       try { 
       String child = new DefaultMutableTreeNode(checker.next()).toString(); 
       if (!children.contains(child)) 
        children.add (child); 
       } catch (NoSuchElementException ex) { 

       } 
      } 
      } 
     } 
     return children; 
     } 

    } 

很容易受到重複的條目,例如:

A->B->C->D 
A->C->E->F 
A->G->H->J 

將變爲:

A+ 
    |B+ 
    | |C+ 
    | |D 
    | |E+ 
    |  |F 
    |C+ 
    | |D 
    | |E+ 
    | |F 
    |G+ 
    |H+ 
     |J 

也許我以後會解決這個問題,也許有人有一個想法怎麼辦呢? 使用示例:

TreePath tpOne = new TreePath(new String [] {"A", "B", "C", "D"}); 
TreePath tpTwo = new TreePath(new String [] {"A", "B", "E", "F"}); 
TreePath tpThree = new TreePath(new String [] {"A", "G", "H", "J"}); 

TreeModel model = new TreePathsTreeModel("A", TreePath[]{tpOne, tpTwo, tpThree} ); 
JTree tree = new JTree(model);