Java 如何在jTree中显示Windows注册表?
我正在使用java swing。我想在jTree中显示windows注册表的可能性。我是java新手,请给我一个解决方案。实际上,我想删除一个特定的windows注册表项,我已经删除了,但我无法在jTree中显示它,这意味着我在删除注册表项之前和之后显示了结构。请查看“” 更新: 要在中显示注册表,您需要提供 我将从from开始,并将文件调用替换为对您正在使用的注册表库的调用 win32注册表可能相当大,因此您可能需要添加一个释放已关闭的分支。这是一个。看一看“” 更新: 要在中显示注册表,您需要提供 我将从from开始,并将文件调用替换为对您正在使用的注册表库的调用Java 如何在jTree中显示Windows注册表?,java,registry,Java,Registry,我正在使用java swing。我想在jTree中显示windows注册表的可能性。我是java新手,请给我一个解决方案。实际上,我想删除一个特定的windows注册表项,我已经删除了,但我无法在jTree中显示它,这意味着我在删除注册表项之前和之后显示了结构。请查看“” 更新: 要在中显示注册表,您需要提供 我将从from开始,并将文件调用替换为对您正在使用的注册表库的调用 win32注册表可能相当大,因此您可能需要添加一个释放已关闭的分支。这是一个。看一看“” 更新: 要在中显示注册表,您需
win32注册表可能相当大,因此您可能需要添加一个释放已关闭的分支。这里有一个。我也有类似的问题,无法找到可以使用的东西。经过一些阅读,我写了一个TreeModel实现类来实现这一点
类可用于将任何树路径列表转换为树,例如:
A->B->C->D
A->B->E->F
A->G->H->J
将成为:
A+
|B+
| |C+
| | |D
| |E+
| |F
|G+
|H+
|J
A+
|B+
| |C+
| |D
| |E+
| |F
|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
| |E+
| |F
|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);
我也有类似的问题,无法找到可以使用的东西。经过一些阅读,我写了一个TreeModel实现类来实现这一点
类可用于将任何树路径列表转换为树,例如:
A->B->C->D
A->B->E->F
A->G->H->J
将成为:
A+
|B+
| |C+
| | |D
| |E+
| |F
|G+
|H+
|J
A+
|B+
| |C+
| |D
| |E+
| |F
|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
| |E+
| |F
|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);
@abs-你应该在答案中添加注释,而不是编辑你的问题。由于您是新用户,我已经为您添加了注释。@abs-您应该为答案添加注释,而不是编辑您的问题。由于您是新用户,我已经为你添加了评论。我知道这篇文章,并以此来阅读这段代码。我可以按照这段代码读写我也可以删除注册表,但通过这个过程我无法显示这是jTree。实际上,我的问题是如何在jTree中显示windows注册表……。请回答。@kleopatra-我自己花了一些时间才弄明白我只是发布评论@abc试图通过编辑答案添加到答案中。(提醒自己,不要那样做)我知道这篇文章,并以此阅读这段代码。我可以按照这篇文章读写,我也可以删除注册表,但通过这一过程,我无法显示这是jTree。实际上,我的问题是如何在jTree中显示windows注册表……。请回答。@kleopatra-我自己花了一些时间才发现我刚刚发布了@abc试图添加的评论通过编辑答案来编辑答案。(提醒自己,不要那样做)