BeanDev: Bestimmte Nodes im View aufklappen (OutlineView)

Dieser Artikel ist der 4. von 4 in der Serie Knotenkunst für Views

Post to Twitter

Im letzten Teil der Serie wurden alle aufgeklappten Nodes eines OutlineViews ermittelt und gespeichert. In diesem Teil der Serie geht es darum diese gespeicherten Informationen zu nutzen, um den Aufbau in einem OutlineView wieder herzustellen.

In der NetBeans IDE sieht man dieses Verhalten seit 6.9 im Projekt-Explorer. Dort werden die aufgeklappten Hierarchien (und selektierten Knoten) nach dem Start so wieder aufgebaut, wie man es beim letzten Schließen verlassen hatte.

Zunächst benötige ich eine Methode, die aus der letzten Serie kodierten Nodes, wieder eine Liste von String Arrays erzeugt. Denn diese Liste braucht man für die NodeOp-Klasse aus dem NetBeans Framework.


  /**
   * Liest aus den Properties die ExpandedPath-Einträge.
   * @param delim   Trenner für den Pfad (z.B. "/")
   * @param props   Properties-Container, in dem die Pfade gespeichert wurden
   * @param prefix  Präfix für die Keys.
   * @return Liste der ermittelten Path-Arrays
   */

  public static List<String[]> loadPaths (String delim, Properties props, String prefix) {
    List<String[]> paths = new ArrayList<String[]>();
    if (prefix == null) prefix = "";
    int count = Integer.parseInt(props.getProperty(prefix + "ExpandedCount", "0"));
    for (int i = 0; i < count; i++) {
      paths.add (props.getProperty(prefix + "ExpandedPath." + i).split(delim));
    }
    return paths;
  }

Diese Pfade können nun mit der folgenden Methode expandiert werden:


  /**
   * Expandiert alle Pfade der Liste, die schon mal über getExpandedPaths ermittelt wurde.
   * @param view
   * @param rootNode
   * @param exPaths
   */

  public static void expandNodes(final OutlineView view, Node rootNode, List<String[]> exPaths) {
    for (final String[] path : exPaths) {
      Node found;
      try {
        found = NodeOp.findPath(rootNode, path);
      } catch (NodeNotFoundException nnfe) {
        found = nnfe.getClosestNode();
      }

      final Node leafNode = found;
      EventQueue.invokeLater(new Runnable() {
        public @Override
        void run() {
          TreeNode visualTreeNode[] = new TreeNode[path.length + 1];
          Node n = leafNode;
          for (int i = path.length; i >= 0; i--) {
            if (n == null) {
              return;
            }
            visualTreeNode[i] = Visualizer.findVisualizer(n);
            n = n.getParentNode();
          }
          view.getOutline().expandPath(new TreePath(visualTreeNode));
        }
      });
    }
  }

In einer Schleife wird zunächst versucht mit der Hilfsmethode NodeOp.findPath den Knoten zu finden, der durch die Kaskade von String-Namen aufzufinden ist. Wird dieser Knoten nicht gefunden, gibt es eine NodeNotFoundException. Diese Exception liefert mit getClosestNode, den Node, der im Pfad als letztes gefunden wurde (wenn wirklich nichts passt, dann ist es die rootNode).

Nun muss in den EventDispatcher-Thread gewechselt werden. In dem TreeNode-Array werden nun alle TreeNodes erfasst, die den Pfad vom letzten Node bis zur root-Node gehen. Auch hier braucht man die Visualizer-Klasse, um aus dem realen Node den VisualizerNode zu erhalten. Wenn das Array zusammen ist, wird expandPath des Outlines aufgerufen. Der TreePath nimmt das Array der VisualizerNodes auf (TreePath arbeitet ja nicht mit String-Pfaden, sondern mit Objekten – und hier immer mit den VisualizerNode-Objekten).

Das sollte es auch schon gewesen sein. So kann man OutlineView-Hierarchien selektiv expandieren. In dem nächsten Teil der Serie werden die Besonderheiten bei einem BeanTreeView beschrieben. Da ist das Verfahren etwas komplizierter.

Serien NavigationBeanDev: Expandierte Nodes ermitteln und speichern (OutlineView)
Dieser Beitrag wurde unter NetBeans Plattform abgelegt und mit , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

eMail-Benachrichtigung bei weiteren Kommentaren.
Auch möglich: Abo ohne Kommentar.