JTree nach Klick auf einen Hyperlink aktualisieren

djmatt

Mitglied
Hallo Leute!

Ich schreibe für Programmieren an der FH einen auf Java basierenden HTML Viewer. So weit funktioniert auch alles, d.h. das Ding stellt die einfache HTML-Files (ohne Tabellen, Bilder,...) korrekt dar und das Navigieren mit Hyperlinks funktioniert dank dem Hyperlinklistener auch wunderbar.

Das einzige was mir jetzt allerdings noch fehlt ist folgendes:

Es soll nach einem Klick auf einen Hyperlink der entsprechende Node (der genauso heißt wie der Hyperlink, da das ganze sehr schlicht gehalten ist) automatisch markiert werden. Konkret heißt das, wenn ich beispielsweise auf den Hyperlink "Funktionen" klicke soll auch der Tree-Node namens "Funktionen" markiert werden.

Ich habe schon einiges versucht, nur hat das hat bis dato nichts bzw. nicht viel gebracht.

Vielleicht kann mir ja hier einer helfen bzw. einen entscheidenden Tipp geben. Entwicklungsumgebung Eclipse 3.5.2.

Nachstehend die relevanten Methoden:
Java:
@Override
	public void actionPerformed(ActionEvent event) {
		String actCmd = event.getActionCommand();
		// get path to currently selected node
		TreePath tp = tree.getLeadSelectionPath();
		if (tp == null)
			return;
		DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();

		if (node == null) {
		    return;
		} else {
			
		}
		
		// get the data model used for this tree
		DefaultTreeModel dtm = (DefaultTreeModel)tree.getModel();
		DefaultMutableTreeNode nodeSel = (DefaultMutableTreeNode)tp.getLastPathComponent();
		// create new child, insert it into the selected node as the last child and
		// expand the tree to show the new child
		if (actCmd.equals("add")) {
			DefaultMutableTreeNode child = new DefaultMutableTreeNode("child");
			dtm.insertNodeInto(child, nodeSel, nodeSel.getChildCount());
			tree.expandPath(tp);
		}
		// get the data assigned to the selected node, modify it and assign it to the node and
		// inform the TreeModel that a node content has changed
		else if (actCmd.equals("change")) {
			String nodeSelUserObj = (String)nodeSel.getUserObject();
			nodeSel.setUserObject(nodeSelUserObj + "C"); 
			dtm.nodeChanged(nodeSel);
		}
		// entire tree cannot be deleted; get parent node of selected node, remove
		// selected node from tree and set new selection path to the parent node
		else {
			if (nodeSel.isRoot())
				return;
			DefaultMutableTreeNode parNode = (DefaultMutableTreeNode)nodeSel.getParent();
			
			tree.setSelectionPath(new TreePath(dtm.getPathToRoot(parNode)));
		}
	}

Java:
// the following method contains the Hyperlinklistener which enables the
	// html viewer to display hyperlinks
	@Override
	public void hyperlinkUpdate(HyperlinkEvent event) {

		if (event.getEventType() == HyperlinkEvent.EventType.ENTERED) {
			edit.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));

		}

		if (event.getEventType() == HyperlinkEvent.EventType.EXITED) {
			edit.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
		}

		if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
			try {
				// in case of long wait time the corresponding system cursor
				// will be shown ;
				edit.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));

				edit.setPage(event.getURL());

			

			} catch (IOException newPageExc) {
				newPageExc.printStackTrace();

			} finally {
				edit.setCursor(Cursor
						.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
			}

		}

	}

	@Override
	public void valueChanged(TreeSelectionEvent e) {
		DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree
				.getLastSelectedPathComponent();

	/**TreePath path = e.getNewLeadSelectionPath();
		tree.setSelectionPath(path);

		System.out.println(path);**/

		if (node == null)
			return;
		if (node == tree.getLastSelectedPathComponent()) {

			Object nodeInfo = node.getUserObject();
			if (node.isLeaf()) {
				URLInfo anker = (URLInfo) nodeInfo;
				displayURL(anker.URL);

				if (DEBUG) {
					System.out.print(":  \n    ");
				}
			}
			if (DEBUG) {
				System.out.println(nodeInfo.toString());
			}
		}
	}

Danke schon mal!
 
Zuletzt bearbeitet:
Hi,

was ist denn genau das Problem?

Ein Ansatz wäre z. B. die Komponente, die den JTree enthält, als Observer bei der Komponente zu registrieren, die die HTML-Seite darstellt.

Dazu muss die JTree-Komponente ein HyperlinkListener sein, d. h. die entsprechende Methode implementieren. Mittels hyperlinkEvent.getURL() oder hyperlinkEvent.getSourceElement().getAttributes() bekommt man die Information, um den Knoten im Baum zu finden. Der wird dann ausgewählt.

Oder habe ich das jetzt falsch verstanden?

Pepe
 
Hi,


Dazu muss die JTree-Komponente ein HyperlinkListener sein, d. h. die entsprechende Methode implementieren. Mittels hyperlinkEvent.getURL() oder hyperlinkEvent.getSourceElement().getAttributes() bekommt man die Information, um den Knoten im Baum zu finden. Der wird dann ausgewählt.

Oder habe ich das jetzt falsch verstanden?

Pepe

Du hast es richtig verstanden, genau das ist das was ich brauche.
 

Zurück
Oben