import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
public class SwapTreeDemo extends JFrame {
private JTree tree;
private DefaultMutableTreeNode root;
private TreePath[] selPath;
public SwapTreeDemo() {
tree = new JTree(this.generateTreeNodes());
this.getContentPane().add(tree, BorderLayout.CENTER);
JPanel panel = new JPanel(new GridLayout(1, 2));
JButton button = new JButton("NEW TREE");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
swapTree();
}
});
panel.add(button);
button = new JButton("OLD SELECTION");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
setSelection();
}
});
panel.add(button);
this.getContentPane().add(panel, BorderLayout.SOUTH);
}
private DefaultMutableTreeNode generateTreeNodes() {
root = new DefaultMutableTreeNode("Wurzel");
DefaultMutableTreeNode node;
for (int i = 0; i < 3; i++) {
root.add(node = new DefaultMutableTreeNode("Test " + i));
for (int k = 0; k < 4; k++)
node.add(new DefaultMutableTreeNode("Test (" + i + ", " + k
+ ")"));
}
return root;
}
public void swapTree() {
selPath = tree.getSelectionPaths();
for (int i = 0; i < selPath.length; i++) {
System.out.println((DefaultMutableTreeNode) selPath[i]
.getLastPathComponent());
}
this.remove(tree);
tree = new JTree(this.generateTreeNodes());
this.getContentPane().add(tree, BorderLayout.CENTER);
this.validateTree();
}
public void setSelection() {
if (selPath != null) {
TreePath[] path = new TreePath[selPath.length];
for (int i = 0; i < selPath.length; i++) {
System.out.println(this.findSimilar(selPath[i]));
path[i] = this.findSimilar(selPath[i]);
}
tree.setSelectionPaths(path);
}
}
private TreePath findSimilar(TreePath path) {
return this.compareChildren(root, path.getPath(), 1);
}
private TreePath compareChildren(TreeNode node, Object[] o, int index) {
TreePath path = null;
for (int i = 0; i < node.getChildCount(); i++) {
TreeNode child = node.getChildAt(i);
// System.out.println("Compare " + o[index].toString() + " <> " +
// child.toString());
if (o[index].toString().equals(child.toString())) {
// System.out.println("Found node " + child.toString());
if (child.getChildCount() > 0 && index < o.length - 1)
path = this.compareChildren(child, o, index + 1);
else {
return new TreePath(((DefaultMutableTreeNode) child).getPath());
}
}
}
return path;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new SwapTreeDemo();
frame.setBounds(0, 0, 500, 300);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}