JTree Zustand speichern: Unterschied zwischen den Versionen

Aus Byte-Welt Wiki
Die Seite wurde neu angelegt: Dieses Beispiel zeigt, wie wir den Zustand von einem JTree speichern können, so daß er nach einem Programmneustart wieder geladen werden kann. <code=java>/* * TreeS...
 
Keine Bearbeitungszusammenfassung
Zeile 2: Zeile 2:


<code=java>/*
<code=java>/*
* TreeStatusDemo.java
*
* This example shows how to store the tree status
* so that it can be reloaded after program restart.
* Maybe it can help you.
*/
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);
            }
        });
    }
}
/*
  * TreeStatusDemo.java
  * TreeStatusDemo.java
  *  
  *  

Version vom 28. Februar 2009, 23:51 Uhr

Dieses Beispiel zeigt, wie wir den Zustand von einem JTree speichern können, so daß er nach einem Programmneustart wieder geladen werden kann.

<code=java>/*

* TreeStatusDemo.java
* 
* This example shows how to store the tree status
* so that it can be reloaded after program restart.
* Maybe it can help you.
*/

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);
           }
       });
   }

}</code=java>