Interner Verweis in HTMLEditorKit

Status
Nicht offen für weitere Antworten.

synchron

Mitglied
Hi,

ich möchte einen internen Verweis im HTMLEditorKit benutzen.
Also

<a name="sprung1" href="#sprung2">eins zu zwei</a>
...
<a name="sprung2" href="#sprung1">zwei zu eins</a>

leider funzt das ganze so nicht. ich bekomme nen Link der nix bewirkt...

mfg
Synchron

ps: ich hasse google bei Suchen mit etwas wie "<a name="...sorry musste ich mal loswerden
 

synchron

Mitglied
Vielen Dank für die antwort!

Ich hab das mal probiert. Er erkennt den link, er reagiert, aber er wirft eine
"java.io.IOException: invalid url"

Als url hab ich nur #sprungpunkt. Da ich das ganze erst on the fly zusammenbastle hab ich keine konkretere URL wie ./dir/dir2/text.html#sprungpunkt

gibts da nen Trick?
 

Michael...

Top Contributor
Mit Ankern habe ich das jetzt noch nicht versucht. Aber mit JEditorPane#getPage() kommt man an die aktuelle URL. Damit sollte sich eine korrekte URL zusammenstellen lassen.
 

synchron

Mitglied
also mal der Stand der Dinge:

Der Listener:

Java:
				ivHtmlPage.addHyperlinkListener(new HyperlinkListener(){
 
         public void hyperlinkUpdate(HyperlinkEvent e) {
             if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
                 JEditorPane pane = (JEditorPane) e.getSource();
                 if (e instanceof HTMLFrameHyperlinkEvent) {
                     HTMLFrameHyperlinkEvent  evt = (HTMLFrameHyperlinkEvent)e;
                     HTMLDocument doc = (HTMLDocument)pane.getDocument();
                     doc.processHTMLFrameHyperlinkEvent(evt);
                 } else {
                     try {
                    	 URL url = new URL(ivHtmlPage.getPage().getPath() + e.getURL().getPath());
                         pane.setPage(url);
                     } catch (Throwable t) {
                         t.printStackTrace();
                     }
                 }
             }
         }
				});

Mit der Zeile
URL url = new URL(ivHtmlPage.getPage().getPath() + e.getURL().getPath());
möchte ich die URL der Seite mit dem Verweis im Code verknüpfen ("#sprungpunkt")


Er bekommt einen Nullpointer, da ivHtmlPage.getPage() null zurück liefert.
Warum weiß ich nicht genau.
Befüllt wird das ganze folgendermaßen:

Java:
ivHtmlPage.setEditorKit(new HTMLEditorKit());
ivHtmlPage.setEditable(false);

StringBuilder b = new StringBuilder();
b.append("<html>");
...
b.append("</html>");
ivHtmlPage.setText(b.toString());
ivHtmlPage.setCaretPosition(0);
 

synchron

Mitglied
hm...leider kein unterschied.

URL url = new URL(pane.getPage().getPath() + e.getURL().getPath());

die gleiche NullPointer....
 

synchron

Mitglied
so, mit etwas hängen und würgen hat es jetzt geklappt.
Ich mische meine Verweise nun nicht mehr als <a name="#sprungpunkt"> sondern mit <a name="file:#sprungpunkt"> ein, da ansonsen mit e.getURL() keine URL erzeugt werden kann. im Listener gucke ich ob meine URL so startet, parse den Sprungpunkt aus und gehe mit ivHtmlPage.scrollToReference(s) an die entsprechende stelle.

kleiner Hinweis für alle mit demselben Problem: setCaretPosition kann nicht benutzt werden, da hier an den Inhalt des Document gegangen wird, der keine html-Tags beinhaltet. Also auch wenn man sich mit nem indexOf die Position innerhalb des html-codes ausgerechnet hat, kommt man mit ste CaretPosition nicht weiter.

Hier der Code:

Java:
				ivHtmlPage.addHyperlinkListener(new HyperlinkListener(){
 
         public void hyperlinkUpdate(HyperlinkEvent e) {
           if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
               JEditorPane pane = (JEditorPane) e.getSource();
               if (e instanceof HTMLFrameHyperlinkEvent) {
                   HTMLFrameHyperlinkEvent  evt = (HTMLFrameHyperlinkEvent)e;
                   HTMLDocument doc = (HTMLDocument)pane.getDocument();
                   doc.processHTMLFrameHyperlinkEvent(evt);
               } else {
              	 if(e.getURL().toString().startsWith("file:#")){
              		 String s = e.getURL().toString().substring(6).trim();
              		 ivHtmlPage.scrollToReference(s);
              	 }else{
                   try {
                       pane.setPage(e.getURL());
                   } catch (Throwable t) {
                       t.printStackTrace();
                   }
              	 }
               }
           }
         }
				});

Hat noch jemand ne bessere Idee wie ich an #sprungpunkt komme ohne zu parsen?
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben