JTree Zustand speichern
Aus Byte-Welt Wiki
Version vom 8. März 2018, 19:40 Uhr von L-ectron-X (Diskussion | Beiträge)
Dieses Beispiel zeigt, wie wir den Zustand von einem JTree speichern können, so daß er nach einem Programmneustart wieder geladen werden kann, d.h. mit den Knoten so wie sie auf- oder zugeklappt waren, mit allen eventuell hinzugefügten Knoten, usw.
/*
* TreeStatusDemo.java
*
* This example shows you how to store the tree status with XMLEncoder
* so that it can be reloaded after program restart.
* Maybe it can help you.
*
* Btw, we can use XMLEncoder not only to store the tree status, but for storing any
* object we like. To do so, it's enough that the objects respect the "Bean" format,
* which is extremely simple:
*
* a public class where we add a default constructor (without parameters)
* and the setXXX and getXXX (or isXXX) methods for the properties.
* That's already all for it to work!
*/
import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import java.io.*;
import java.util.*;
import java.util.List;
import javax.swing.*;
import javax.swing.tree.*;
public class TreeStatusDemo extends JFrame {
private JToolBar toolbar;
private JButton btAdd;
private JTree tree;
private TreeModel model;
private List<TreeNode[]> expanded;
private int countNew;
public TreeStatusDemo() {
super("Tree Status Demo");
setSize(400, 300);
setLocationRelativeTo(null);
setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
toolbar = new JToolBar();
btAdd = new JButton("Add Node");
tree = new JTree();
toolbar.add(btAdd);
getContentPane().add(toolbar, BorderLayout.NORTH);
tree.setEditable(true);
getContentPane().add(new JScrollPane(tree), BorderLayout.CENTER);
try {
deSerialize();
restoreStatus();
} catch (Exception e) {
}
model = tree.getModel();
btAdd.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent evt) {
addNode();
}
});
addWindowListener(new WindowAdapter() {
public void windowClosing(final WindowEvent e) {
saveStatus();
serialize();
System.exit(0);
}
});
}
private void saveStatus() {
//save the expanded Nodes:
expanded = new ArrayList<TreeNode[]>();
collectStatusInfo(model.getRoot());
}
private void restoreStatus() {
//expand the saved Nodes:
for (int i = expanded.size() - 1; i > -1; i--) {
TreeNode[] ar = expanded.get(i);
tree.expandPath(new TreePath(ar));
}
}
private void collectStatusInfo(final Object o) {
int cc = model.getChildCount(o);
for (int i = 0; i < cc; i++) {
DefaultMutableTreeNode child = (DefaultMutableTreeNode) model.getChild(o, i);
TreeNode[] ar = child.getPath();
if (!model.isLeaf(child) && tree.isExpanded(new TreePath(ar))) {
expanded.add(ar);
collectStatusInfo(child);
}
}
}
private void addNode() {
TreePath selectedPath = tree.getSelectionPath();
if (selectedPath == null) {
return;
}
DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) selectedPath.getLastPathComponent();
DefaultMutableTreeNode newChild = new DefaultMutableTreeNode("new node " + countNew++);
((DefaultTreeModel) tree.getModel()).insertNodeInto(newChild, selectedNode, selectedNode.getChildCount());
TreePath newPath = selectedPath.pathByAddingChild(newChild);
tree.setSelectionPath(newPath);
tree.startEditingAtPath(newPath);
}
public void serialize() {
try {
XMLEncoder o = new XMLEncoder(new BufferedOutputStream(new FileOutputStream("tree.xml")));
o.writeObject(tree.getModel());
o.writeObject(expanded);
o.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
private void deSerialize() {
try {
XMLDecoder d = new XMLDecoder(new BufferedInputStream(new FileInputStream("tree.xml")));
tree.setModel((TreeModel) d.readObject());
expanded = (List<TreeNode[]>) d.readObject();
d.close();
} catch (FileNotFoundException ex) {
}
}
public static void main(final String args[]) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new TreeStatusDemo().setVisible(true);
}
});
}
}