Как я показываю реестр Windows в jTree?
Я использую java swing. Я хочу показать реестр Windows в jTree, как это возможно. Я новичок в java, пожалуйста, дайте мне решение. На самом деле я хочу удалить определенный раздел реестра Windows, я сделал это, но я не могу показать его в jtree означает, что я показываю структуру до удаления regkey и после удаления.
2 ответа
У меня была похожая проблема, и я не смог найти что-то готовое к использованию. После некоторого чтения я написал класс реализации 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);
Взгляните на " чтение / запись в реестр Windows с использованием Java"
Обновление: для отображения реестра в JTree вам необходимо предоставить TreeModel.
Я бы начал с FileSystemModel из Oracle's Understanding TreeModel и заменил вызовы File вызовами в библиотеку реестра, которую вы используете.
Реестр win32 может быть довольно большим, поэтому вам, вероятно, потребуется добавить TreeExpansionListener для освобождения закрытых веток. Вот статья Oracle о слушателях расширения дерева.