Nodes eines statischen JTrees sollen auf Anker (Textmarken) in einer HTML-Datei zeigen

djmatt

Mitglied
Nachdem ich die Idee mit dem dynamischen JTree verworfen habe, hab ich nun einen statischen JTree in mein Java-Projekt (HTML-Viewer) implementiert. Eins gleich vorweg: der HTML-Viewer ist nun maßgeschneidert auf eine bestimmte HTML-Datei (mein Professor hat nämlich gemeint, ich soll mir da nicht zu viel Aufwand antun).

Hier hab ich allerdings folgendes Problem:
Ich schaffe es nicht, das irgendwie hinzu bekommen, dass die Nodes des Trees auf eine Textmarke, die in der HTML-Datei definiert wurde, zeigen. Es soll nämlich beim Klick auf einen dieser Nodes zur entsprechenden Textmarke in der HTML-Datei gesprungen werden (soll in der EditorPane auf der rechten Seite - siehe angehängtes Bild - dann natürlich angezeigt werden).

Ich hab da schon einiges probiert, bin aber bis jetzt nicht auf einen grünen Zweig gekommen.

Hier mal die entsprechende Klasse, diese die Anker definiert + der dazu gehörige Konstruktor
Java:
	private class AnkerInfo {
		public String ankerName;
		public URL ankerURL;

		public AnkerInfo(String anker, String filename) {
			ankerName = anker;
			ankerURL = getClass().getResource(filename);
			if (ankerURL == null) {
				System.err
						.println("Folgende Datei konnte nicht gefunden werden: "
								+ filename);
			}
		}

		public String toString() {
			return ankerName;
		}
	}

Und nachstehend einer meiner Versuche, das Problem zu lösen:
Java:
private void createNodes(DefaultMutableTreeNode top) {
		DefaultMutableTreeNode category = null;
		DefaultMutableTreeNode anker = null;

		category = new DefaultMutableTreeNode("Files");
		top.add(category);

		anker = new DefaultMutableTreeNode(new AnkerInfo("Introduction",
				"index.html"));
		category.add(anker);

		anker = new DefaultMutableTreeNode(new AnkerInfo("Functions",
				"index.html#Functions"));
		category.add(anker);

		anker = new DefaultMutableTreeNode(new AnkerInfo("Systemrequirements",
				"index.html#Systemrequirements"));
		category.add(anker);

		anker = new DefaultMutableTreeNode(new AnkerInfo("Further Information",
				"index.html#Furtherinf"));
		category.add(anker);

		anker = new DefaultMutableTreeNode(new AnkerInfo("Credits",
				"index.html#credits"));
		category.add(anker);

	}

Anscheinend denkt das Programm, dass es bei zB. bei dem Stringwert "index.html#credits" um den gesamten Dateinamen handelt...Daher bekomm ich dann natürlich auch auf der Konsole und im Programm selbst die Fehlermeldung, dass die entsprechende Datei nicht gefunden wurde. Es soll allerdings dem Programm irgendwie klargemacht werden, dass es sich bei #credits um eine Textmarke handelt.

Hat hier jemand ne Idee?
 

Anhänge

  • Bildschirmfoto-HTML-Viewer by M. Kainz.png
    Bildschirmfoto-HTML-Viewer by M. Kainz.png
    46,7 KB · Aufrufe: 44
Hm... vielleicht mit
int index = string.indexOf("#")
schauen, ob dort ein # drin vorkommt, und falls ja (also falls das Ergebnis !=-1 ist) mit
String s = string.substring(0, index);
den Teil ohne den Ankerteil rausfischen!?
 
ich hab das probiert, nur spuckt mir das Eclipse schon bei der Variablendeklaration eine Fehlermeldung aus:

cannot make a static reference to the non-static method indexOf(String) from the type String
 
Wieder mal einer meiner unzähligen Versuche, das Problem in den Griff zu bekommen.
Tu mich leider ein bisschen schwerer bei der Materie (bin noch Newbie bei Java).

Java:
  private class AnkerInfo {
        public String ankerName;
        public URL ankerURL;
	public int index = String.indexOf("#");

 
        public AnkerInfo(String anker, String filename, int index) {
            ankerName = anker;
            ankerURL = getClass().getResource(filename + index);
            if (ankerURL == null) {
                System.err
                        .println("Folgende Datei konnte nicht gefunden werden: "
                                + filename + index);
            }
        }
 
        public String toString() {
            return ankerName;
        }
    }


private void createNodes(DefaultMutableTreeNode top) {
        DefaultMutableTreeNode category = null;
        DefaultMutableTreeNode anker = null;
 
        category = new DefaultMutableTreeNode("Files");
        top.add(category);
 
        anker = new DefaultMutableTreeNode(new AnkerInfo("Introduction",
                "index.html",""));
        category.add(anker);
 
        anker = new DefaultMutableTreeNode(new AnkerInfo("Functions",
                "index.html","#Functions"));
        category.add(anker);
 
        anker = new DefaultMutableTreeNode(new AnkerInfo("Systemrequirements",
                "index.html","#Systemrequirements"));
        category.add(anker);
 
        anker = new DefaultMutableTreeNode(new AnkerInfo("Further Information",
                "index.html","#Furtherinformation"));
        category.add(anker);
 
        anker = new DefaultMutableTreeNode(new AnkerInfo("Credits",
                "index.html","#credits"));
        category.add(anker);
 
    }
 
Weiters hier der Code aller Klassen und Methoden, die für die Links bzw. Anker (Textmarken) relevant sind (Bearbeitungsstand: 9.7.2010, daher der int-Wert noch nicht implementiert)

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 {
				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();

		if (node == null)
			return;

		Object nodeInfo = node.getUserObject();
		if (node.isLeaf()) {
			AnkerInfo anker = (AnkerInfo) nodeInfo;
			displayURL(anker.ankerURL);
			if (DEBUG) {
				System.out.print(anker.ankerURL + ":  \n    ");
			}
		}
		if (DEBUG) {
			System.out.println(nodeInfo.toString());
		}
	}

	private void displayURL(URL url) {
		try {
			if (url != null) {
				edit.setPage(url);
			} else { // null url
				edit.setText("Link/Datei oder Anker nicht gefunden");

			}
		} catch (IOException e) {
			System.err.println("Attempted to read a bad URL: " + url);
		}
	}

	private class AnkerInfo {
		public String ankerName;
		public URL ankerURL;
		public String ankerL;

		public AnkerInfo(String anker, String filename, String ankerLabel, String string) {
			ankerName = anker;
			ankerURL = getClass().getResource(filename + ankerLabel);
			ankerL = ankerLabel;
			if (ankerURL == null) {
				System.err
						.println("Folgende Datei konnte nicht gefunden werden: "
								+ filename + ankerLabel);
			}
		}

		public String toString() {
			return ankerName;
		}
	}

	private void createNodes(DefaultMutableTreeNode top) {
		DefaultMutableTreeNode category = null;
		DefaultMutableTreeNode anker = null;

		category = new DefaultMutableTreeNode("Files");
		top.add(category);

		anker = new DefaultMutableTreeNode(new AnkerInfo("Introduction","",
				"index.html",""));
		category.add(anker);

		anker = new DefaultMutableTreeNode(new AnkerInfo("Functions","",
				"index.html#Function" ,""));
		category.add(anker);

		anker = new DefaultMutableTreeNode(new AnkerInfo("Systemrequirements","",
				"index.html#systemrequirements",""));
		category.add(anker);

		anker = new DefaultMutableTreeNode(new AnkerInfo("Further Information","",
				"index.html#Furtherinf",""));
		category.add(anker);

		anker = new DefaultMutableTreeNode(new AnkerInfo("Credits","",
				"index.html#credits",""));
		category.add(anker);

	}

	public void windowClosing(WindowEvent event) {

		System.exit(0);
	}

vielleicht liegt ja da irgendwo der Fehler.
 
Java:
public int index = String.indexOf("#");
Da liegt der Fehler. indexOf() ist nunmal keine statische Methode 🙂
Und woher sollte die Methode so auch wissen wo nach der Raute gesucht werden sollte?

indexOf() rufst du auf einem existierenden String auf:

Java:
String test = "123456789";
int index = test.indexOf("3");
 

Neue Themen


Zurück
Oben