JTree Zustand speichern: Unterschied zwischen den Versionen

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen
(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...)
 
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>